/*
 * Copyright (c) 2019, NVIDIA CORPORATION. All rights reserved.
 *
 * Permission is hereby granted, free of charge, to any person obtaining a
 * copy of this software and associated documentation files (the "Software"),
 * to deal in the Software without restriction, including without limitation
 * the rights to use, copy, modify, merge, publish, distribute, sublicense,
 * and/or sell copies of the Software, and to permit persons to whom the
 * Software is furnished to do so, subject to the following conditions:
 *
 * The above copyright notice and this permission notice shall be included in
 * all copies or substantial portions of the Software.
 *
 * THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
 * IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
 * FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT.  IN NO EVENT SHALL
 * THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
 * LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING
 * FROM, OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER
 * DEALINGS IN THE SOFTWARE.
 */

#include "cudaColormap.h"
#include "cudaFilterMode.cuh"
#include "cudaVector.h"


// cudaColormapFromStr
cudaColormapType cudaColormapFromStr( const char* str )
{
	if( !str )
		return COLORMAP_DEFAULT;

	if( strcasecmp(str, "inferno") == 0 )
		return COLORMAP_INFERNO;
	else if( strcasecmp(str, "magma") == 0 )
		return COLORMAP_MAGMA;
	else if( strcasecmp(str, "parula") == 0 )
		return COLORMAP_PARULA;
	else if( strcasecmp(str, "plasma") == 0 )
		return COLORMAP_PLASMA;
	else if( strcasecmp(str, "turbo") == 0 )
		return COLORMAP_TURBO;
	else if( strcasecmp(str, "viridis") == 0 )
		return COLORMAP_VIRIDIS;
	else if( strcasecmp(str, "inferno-inverted") == 0 || strcasecmp(str, "inferno_inverted") == 0 )
		return COLORMAP_INFERNO_INVERTED;
	else if( strcasecmp(str, "magma-inverted") == 0 || strcasecmp(str, "magma_inverted") == 0 )
		return COLORMAP_MAGMA_INVERTED;
	else if( strcasecmp(str, "parula-inverted") == 0 || strcasecmp(str, "parula_inverted") == 0 )
		return COLORMAP_PARULA_INVERTED;
	else if( strcasecmp(str, "plasma-inverted") == 0 || strcasecmp(str, "plasma_inverted") == 0 )
		return COLORMAP_PLASMA_INVERTED;
	else if( strcasecmp(str, "turbo-inverted") == 0 || strcasecmp(str, "turbo_inverted") == 0 )
		return COLORMAP_TURBO_INVERTED;
	else if( strcasecmp(str, "viridis-inverted") == 0 || strcasecmp(str, "viridis_inverted") == 0 )
		return COLORMAP_VIRIDIS_INVERTED;
	else if( strcasecmp(str, "flow") == 0 )
		return COLORMAP_FLOW;
	else if( strcasecmp(str, "none") == 0 )
		return COLORMAP_NONE;
	else if( strcasecmp(str, "linear") == 0 )
		return COLORMAP_LINEAR;
	else if( strcasecmp(str, "default") == 0 )
		return COLORMAP_DEFAULT;

	return COLORMAP_DEFAULT;
}


// cudaColormapToStr
const char* cudaColormapToStr( cudaColormapType colormap )
{
	switch(colormap)
	{
		case COLORMAP_INFERNO:          return "inferno";
		case COLORMAP_MAGMA:            return "magma";
		case COLORMAP_PARULA:           return "parula";
		case COLORMAP_PLASMA:           return "plasma";
		case COLORMAP_TURBO:            return "turbo";
		case COLORMAP_VIRIDIS:          return "viridis";
		case COLORMAP_INFERNO_INVERTED: return "inferno-inverted";
		case COLORMAP_MAGMA_INVERTED:	  return "magma-inverted";
		case COLORMAP_PARULA_INVERTED:  return "parula-inverted";
		case COLORMAP_PLASMA_INVERTED:  return "plasma-inverted";
		case COLORMAP_TURBO_INVERTED:	  return "turbo-inverted";
		case COLORMAP_VIRIDIS_INVERTED: return "viridis-inverted";
		case COLORMAP_FLOW:		       return "flow";
		case COLORMAP_NONE:		       return "none";
		case COLORMAP_LINEAR:	       return "linear";
	}

	return "default";
}


static const float4 colormapPalettes[] = {
	{ 0.372810, 0.118830, 3.535830, 255.0f },
	{ 0.578085, 0.323850, 4.735350, 255.0f },
	{ 0.841245, 0.573495, 6.180945, 255.0f },
	{ 1.159485, 0.864960, 7.881795, 255.0f },
	{ 1.531530, 1.196460, 9.832290, 255.0f },
	{ 1.957380, 1.564680, 11.943180, 255.0f },
	{ 2.438055, 1.966815, 14.061464, 255.0f },
	{ 2.974065, 2.401335, 16.182301, 255.0f },
	{ 3.568725, 2.862375, 18.324810, 255.0f },
	{ 4.223055, 3.349680, 20.471910, 255.0f },
	{ 4.940115, 3.858915, 22.635586, 255.0f },
	{ 5.723985, 4.385745, 24.818386, 255.0f },
	{ 6.577215, 4.929405, 27.012150, 255.0f },
	{ 7.505160, 5.483265, 29.228355, 255.0f },
	{ 8.513175, 6.044010, 31.466234, 255.0f },
	{ 9.605340, 6.609855, 33.719158, 255.0f },
	{ 10.774515, 7.175445, 35.990955, 255.0f },
	{ 11.963325, 7.732620, 38.291817, 255.0f },
	{ 13.169220, 8.280870, 40.609772, 255.0f },
	{ 14.394495, 8.815095, 42.945568, 255.0f },
	{ 15.641700, 9.330450, 45.298710, 255.0f },
	{ 16.914404, 9.818521, 47.675308, 255.0f },
	{ 18.214396, 10.274970, 50.070271, 255.0f },
	{ 19.542435, 10.685775, 52.478745, 255.0f },
	{ 20.900309, 11.048639, 54.898693, 255.0f },
	{ 22.289804, 11.361780, 57.327316, 255.0f },
	{ 23.712450, 11.623665, 59.761288, 255.0f },
	{ 25.169010, 11.832510, 62.195518, 255.0f },
	{ 26.660505, 11.987041, 64.624649, 255.0f },
	{ 28.186680, 12.086745, 67.042564, 255.0f },
	{ 29.747280, 12.131370, 69.441849, 255.0f },
	{ 31.341541, 12.121680, 71.814117, 255.0f },
	{ 32.967674, 12.059715, 74.150940, 255.0f },
	{ 34.623390, 11.948280, 76.442879, 255.0f },
	{ 36.306389, 11.791710, 78.681015, 255.0f },
	{ 38.013615, 11.594339, 80.856674, 255.0f },
	{ 39.741749, 11.362545, 82.961189, 255.0f },
	{ 41.485695, 11.106270, 84.985634, 255.0f },
	{ 43.241627, 10.834695, 86.922867, 255.0f },
	{ 45.005714, 10.557510, 88.768303, 255.0f },
	{ 46.774395, 10.283895, 90.517601, 255.0f },
	{ 48.543583, 10.023795, 92.168983, 255.0f },
	{ 50.310738, 9.792001, 93.721420, 255.0f },
	{ 52.073296, 9.596160, 95.175690, 255.0f },
	{ 53.829227, 9.442650, 96.533562, 255.0f },
	{ 55.576996, 9.336824, 97.798111, 255.0f },
	{ 57.314568, 9.283276, 98.972893, 255.0f },
	{ 59.042191, 9.283276, 100.061996, 255.0f },
	{ 60.759613, 9.338355, 101.070015, 255.0f },
	{ 62.466583, 9.449025, 102.001785, 255.0f },
	{ 64.163101, 9.614775, 102.861389, 255.0f },
	{ 65.849670, 9.835605, 103.653671, 255.0f },
	{ 67.526550, 10.109985, 104.382973, 255.0f },
	{ 69.193481, 10.435110, 105.053879, 255.0f },
	{ 70.851753, 10.800015, 105.669960, 255.0f },
	{ 72.501854, 11.202915, 106.235039, 255.0f },
	{ 74.144562, 11.639220, 106.752434, 255.0f },
	{ 75.780388, 12.104850, 107.225204, 255.0f },
	{ 77.409843, 12.595981, 107.656410, 255.0f },
	{ 79.033424, 13.108785, 108.048851, 255.0f },
	{ 80.651909, 13.639951, 108.404579, 255.0f },
	{ 82.265549, 14.186670, 108.726135, 255.0f },
	{ 83.874855, 14.745885, 109.015305, 255.0f },
	{ 85.480331, 15.315300, 109.273621, 255.0f },
	{ 87.082504, 15.892876, 109.503372, 255.0f },
	{ 88.681602, 16.477081, 109.705338, 255.0f },
	{ 90.278160, 17.065874, 109.881027, 255.0f },
	{ 91.872421, 17.657986, 110.031738, 255.0f },
	{ 93.464890, 18.252645, 110.158470, 255.0f },
	{ 95.055847, 18.848324, 110.261993, 255.0f },
	{ 96.645256, 19.444513, 110.343346, 255.0f },
	{ 98.233139, 20.040705, 110.403526, 255.0f },
	{ 99.820511, 20.636385, 110.442795, 255.0f },
	{ 101.406868, 21.230534, 110.461670, 255.0f },
	{ 102.992973, 21.822899, 110.460640, 255.0f },
	{ 104.578819, 22.413479, 110.439987, 255.0f },
	{ 106.164406, 23.001766, 110.400459, 255.0f },
	{ 107.750000, 23.587755, 110.342064, 255.0f },
	{ 109.335846, 24.171450, 110.265060, 255.0f },
	{ 110.921684, 24.752596, 110.169945, 255.0f },
	{ 112.507782, 25.331190, 110.056473, 255.0f },
	{ 114.094139, 25.907236, 109.925400, 255.0f },
	{ 115.681007, 26.481241, 109.776993, 255.0f },
	{ 117.268120, 27.052696, 109.610725, 255.0f },
	{ 118.855499, 27.622110, 109.426880, 255.0f },
	{ 120.443642, 28.189486, 109.225166, 255.0f },
	{ 122.032288, 28.754820, 109.006126, 255.0f },
	{ 123.621201, 29.318371, 108.769745, 255.0f },
	{ 125.210609, 29.880644, 108.515762, 255.0f },
	{ 126.800537, 30.441645, 108.244446, 255.0f },
	{ 128.390717, 31.001625, 107.955780, 255.0f },
	{ 129.981140, 31.561094, 107.649780, 255.0f },
	{ 131.571594, 32.119801, 107.326187, 255.0f },
	{ 133.162537, 32.678249, 106.984993, 255.0f },
	{ 134.753220, 33.236954, 106.626205, 255.0f },
	{ 136.344162, 33.796169, 106.250092, 255.0f },
	{ 137.934601, 34.355896, 105.856361, 255.0f },
	{ 139.525040, 34.916897, 105.445305, 255.0f },
	{ 141.114960, 35.479172, 105.016396, 255.0f },
	{ 142.704117, 36.043228, 104.569885, 255.0f },
	{ 144.292770, 36.609585, 104.105789, 255.0f },
	{ 145.880661, 37.178234, 103.624092, 255.0f },
	{ 147.467514, 37.749943, 103.124802, 255.0f },
	{ 149.052856, 38.324970, 102.608177, 255.0f },
	{ 150.637177, 38.903568, 102.073952, 255.0f },
	{ 152.219696, 39.486240, 101.521873, 255.0f },
	{ 153.800446, 40.073505, 100.952209, 255.0f },
	{ 155.379150, 40.665871, 100.365196, 255.0f },
	{ 156.955826, 41.263336, 99.760841, 255.0f },
	{ 158.529678, 41.866920, 99.139160, 255.0f },
	{ 160.100983, 42.476624, 98.500381, 255.0f },
	{ 161.669479, 43.092960, 97.844521, 255.0f },
	{ 163.234421, 43.716690, 97.171577, 255.0f },
	{ 164.796310, 44.348068, 96.481544, 255.0f },
	{ 166.354095, 44.987354, 95.774429, 255.0f },
	{ 167.908066, 45.635311, 95.050735, 255.0f },
	{ 169.457703, 46.292446, 94.310730, 255.0f },
	{ 171.002747, 46.959015, 93.554138, 255.0f },
	{ 172.542694, 47.635788, 92.781502, 255.0f },
	{ 174.077271, 48.322754, 91.993034, 255.0f },
	{ 175.606506, 49.020947, 91.188766, 255.0f },
	{ 177.129883, 49.730354, 90.368942, 255.0f },
	{ 178.646881, 50.452007, 89.533813, 255.0f },
	{ 180.157501, 51.185638, 88.683136, 255.0f },
	{ 181.660980, 51.932281, 87.817665, 255.0f },
	{ 183.157318, 52.692181, 86.937401, 255.0f },
	{ 184.646255, 53.465851, 86.043121, 255.0f },
	{ 186.126801, 54.253548, 85.134552, 255.0f },
	{ 187.599167, 55.056030, 84.212471, 255.0f },
	{ 189.062866, 55.873558, 83.276878, 255.0f },
	{ 190.517380, 56.706390, 82.328285, 255.0f },
	{ 191.962479, 57.555031, 81.366676, 255.0f },
	{ 193.397614, 58.419735, 80.392830, 255.0f },
	{ 194.822556, 59.301270, 79.406746, 255.0f },
	{ 196.236771, 60.199635, 78.408676, 255.0f },
	{ 197.640045, 61.115086, 77.399132, 255.0f },
	{ 199.031830, 62.048386, 76.378365, 255.0f },
	{ 200.411896, 62.999283, 75.346634, 255.0f },
	{ 201.779724, 63.968285, 74.304451, 255.0f },
	{ 203.134796, 64.955635, 73.252319, 255.0f },
	{ 204.477112, 65.961868, 72.190247, 255.0f },
	{ 205.805908, 66.986458, 71.118988, 255.0f },
	{ 207.120941, 68.030434, 70.038559, 255.0f },
	{ 208.421967, 69.093277, 68.949448, 255.0f },
	{ 209.708435, 70.175232, 67.851677, 255.0f },
	{ 210.979858, 71.276833, 66.746254, 255.0f },
	{ 212.236237, 72.397812, 65.632660, 255.0f },
	{ 213.477081, 73.538177, 64.511940, 255.0f },
	{ 214.702103, 74.697914, 63.383820, 255.0f },
	{ 215.910797, 75.877541, 62.248814, 255.0f },
	{ 217.102921, 77.076302, 61.107182, 255.0f },
	{ 218.277969, 78.294693, 59.958916, 255.0f },
	{ 219.435913, 79.532463, 58.804531, 255.0f },
	{ 220.576538, 80.789612, 57.644024, 255.0f },
	{ 221.699295, 82.065880, 56.477909, 255.0f },
	{ 222.803955, 83.361031, 55.305931, 255.0f },
	{ 223.890244, 84.675301, 54.128338, 255.0f },
	{ 224.957947, 86.008186, 52.945141, 255.0f },
	{ 226.007004, 87.359436, 51.756840, 255.0f },
	{ 227.036957, 88.729034, 50.562931, 255.0f },
	{ 228.047775, 90.116745, 49.363918, 255.0f },
	{ 229.038956, 91.522308, 48.159298, 255.0f },
	{ 230.010757, 92.945457, 46.949581, 255.0f },
	{ 230.962433, 94.385696, 45.734249, 255.0f },
	{ 231.894440, 95.843285, 44.513565, 255.0f },
	{ 232.806335, 97.317177, 43.287525, 255.0f },
	{ 233.697815, 98.807655, 42.055618, 255.0f },
	{ 234.569153, 100.314194, 40.817852, 255.0f },
	{ 235.419815, 101.836540, 39.574215, 255.0f },
	{ 236.249847, 103.374199, 38.324459, 255.0f },
	{ 237.059219, 104.927147, 37.068584, 255.0f },
	{ 237.847931, 106.494888, 35.806335, 255.0f },
	{ 238.615494, 108.076904, 34.537201, 255.0f },
	{ 239.362122, 109.673203, 33.261688, 255.0f },
	{ 240.087845, 111.283279, 31.979298, 255.0f },
	{ 240.792664, 112.906860, 30.690269, 255.0f },
	{ 241.476074, 114.543709, 29.394360, 255.0f },
	{ 242.138321, 116.193298, 28.091820, 255.0f },
	{ 242.779129, 117.855385, 26.782906, 255.0f },
	{ 243.399017, 119.529724, 25.467869, 255.0f },
	{ 243.997269, 121.215782, 24.147226, 255.0f },
	{ 244.574081, 122.913567, 22.822245, 255.0f },
	{ 245.129715, 124.622581, 21.493694, 255.0f },
	{ 245.663681, 126.342812, 20.163614, 255.0f },
	{ 246.176239, 128.073502, 18.834045, 255.0f },
	{ 246.667114, 129.814896, 17.508045, 255.0f },
	{ 247.136566, 131.566223, 16.189440, 255.0f },
	{ 247.584351, 133.327515, 14.883585, 255.0f },
	{ 248.010452, 135.098480, 13.597620, 255.0f },
	{ 248.414871, 136.878906, 12.339960, 255.0f },
	{ 248.797638, 138.668503, 11.122590, 255.0f },
	{ 249.158463, 140.466736, 9.957750, 255.0f },
	{ 249.497604, 142.273941, 8.907405, 255.0f },
	{ 249.814835, 144.089523, 8.009295, 255.0f },
	{ 250.110123, 145.913300, 7.269540, 255.0f },
	{ 250.383240, 147.744965, 6.693750, 255.0f },
	{ 250.634659, 149.584534, 6.288555, 255.0f },
	{ 250.863647, 151.431503, 6.061350, 255.0f },
	{ 251.070709, 153.286118, 6.019530, 255.0f },
	{ 251.255325, 155.147598, 6.171510, 255.0f },
	{ 251.417770, 157.016251, 6.525960, 255.0f },
	{ 251.558014, 158.891769, 7.092570, 255.0f },
	{ 251.675812, 160.773682, 7.881540, 255.0f },
	{ 251.770935, 162.661942, 8.903580, 255.0f },
	{ 251.843613, 164.556595, 10.170930, 255.0f },
	{ 251.893845, 166.457123, 11.623156, 255.0f },
	{ 251.921127, 168.363754, 13.196250, 255.0f },
	{ 251.925980, 170.275726, 14.873896, 255.0f },
	{ 251.907867, 172.193085, 16.640535, 255.0f },
	{ 251.867065, 174.115799, 18.484695, 255.0f },
	{ 251.803329, 176.043335, 20.397449, 255.0f },
	{ 251.716629, 177.975723, 22.371405, 255.0f },
	{ 251.606964, 179.912704, 24.401970, 255.0f },
	{ 251.474625, 181.854019, 26.485065, 255.0f },
	{ 251.319336, 183.799408, 28.618395, 255.0f },
	{ 251.140579, 185.748886, 30.800175, 255.0f },
	{ 250.939133, 187.702194, 33.029385, 255.0f },
	{ 250.714981, 189.658295, 35.305515, 255.0f },
	{ 250.468140, 191.617706, 37.629078, 255.0f },
	{ 250.199112, 193.579422, 40.000065, 255.0f },
	{ 249.908173, 195.543442, 42.420017, 255.0f },
	{ 249.595535, 197.508972, 44.889435, 255.0f },
	{ 249.261734, 199.475784, 47.410362, 255.0f },
	{ 248.907547, 201.443359, 49.984589, 255.0f },
	{ 248.532684, 203.411453, 52.614658, 255.0f },
	{ 248.137451, 205.379303, 55.303635, 255.0f },
	{ 247.724335, 207.346100, 58.052792, 255.0f },
	{ 247.294662, 209.310364, 60.864929, 255.0f },
	{ 246.850449, 211.271317, 63.742859, 255.0f },
	{ 246.391968, 213.228699, 66.691170, 255.0f },
	{ 245.920456, 215.181244, 69.714706, 255.0f },
	{ 245.441833, 217.126389, 72.814232, 255.0f },
	{ 244.959625, 219.062592, 75.992546, 255.0f },
	{ 244.473602, 220.989120, 79.259102, 255.0f },
	{ 243.992676, 222.902893, 82.613373, 255.0f },
	{ 243.524231, 224.800095, 86.056122, 255.0f },
	{ 243.069824, 226.680206, 89.599091, 255.0f },
	{ 242.644226, 228.537628, 93.234886, 255.0f },
	{ 242.254593, 230.369293, 96.969101, 255.0f },
	{ 241.914169, 232.170609, 100.798698, 255.0f },
	{ 241.636459, 233.936737, 104.719574, 255.0f },
	{ 241.436295, 235.662842, 108.725113, 255.0f },
	{ 241.329956, 237.344055, 112.803581, 255.0f },
	{ 241.332779, 238.975540, 116.940956, 255.0f },
	{ 241.460266, 240.553741, 121.117355, 255.0f },
	{ 241.723938, 242.076080, 125.313629, 255.0f },
	{ 242.133987, 243.541061, 129.504303, 255.0f },
	{ 242.693710, 244.949692, 133.671768, 255.0f },
	{ 243.404892, 246.303482, 137.792053, 255.0f },
	{ 244.263474, 247.605759, 141.850128, 255.0f },
	{ 245.262070, 248.860626, 145.840866, 255.0f },
	{ 246.393494, 250.072891, 149.737534, 255.0f },
	{ 247.646317, 251.246918, 153.549271, 255.0f },
	{ 249.010300, 252.387024, 157.273804, 255.0f },
	{ 250.475540, 253.497787, 160.909348, 255.0f },
	{ 252.032318, 254.582809, 164.455612, 255.0f },
	{ 0.372810, 0.118830, 3.535830, 255.0f },
	{ 0.575790, 0.330225, 4.674405, 255.0f },
	{ 0.836145, 0.587775, 6.045540, 255.0f },
	{ 1.150560, 0.889950, 7.641075, 255.0f },
	{ 1.517250, 1.234965, 9.468149, 255.0f },
	{ 1.934940, 1.620780, 11.468115, 255.0f },
	{ 2.403630, 2.045610, 13.475220, 255.0f },
	{ 2.923575, 2.506140, 15.491250, 255.0f },
	{ 3.495540, 3.001605, 17.510086, 255.0f },
	{ 4.119780, 3.529200, 19.533766, 255.0f },
	{ 4.797825, 4.086630, 21.568920, 255.0f },
	{ 5.531460, 4.671600, 23.615551, 255.0f },
	{ 6.321960, 5.282325, 25.672380, 255.0f },
	{ 7.171365, 5.916255, 27.740685, 255.0f },
	{ 8.082479, 6.570075, 29.826077, 255.0f },
	{ 9.057600, 7.241235, 31.928295, 255.0f },
	{ 10.100040, 7.927950, 34.046326, 255.0f },
	{ 11.176650, 8.626650, 36.180927, 255.0f },
	{ 12.255810, 9.334785, 38.333385, 255.0f },
	{ 13.341600, 10.048785, 40.504456, 255.0f },
	{ 14.436825, 10.750800, 42.698730, 255.0f },
	{ 15.541995, 11.422470, 44.912895, 255.0f },
	{ 16.659149, 12.066090, 47.147461, 255.0f },
	{ 17.789822, 12.680130, 49.402428, 255.0f },
	{ 18.935535, 13.264335, 51.678299, 255.0f },
	{ 20.097824, 13.816920, 53.975086, 255.0f },
	{ 21.278730, 14.337376, 56.292522, 255.0f },
	{ 22.479525, 14.823915, 58.630108, 255.0f },
	{ 23.701996, 15.275520, 60.986820, 255.0f },
	{ 24.947414, 15.690405, 63.361633, 255.0f },
	{ 26.217825, 16.067551, 65.752777, 255.0f },
	{ 27.514246, 16.405426, 68.158699, 255.0f },
	{ 28.838970, 16.700459, 70.579918, 255.0f },
	{ 30.193275, 16.952145, 73.011856, 255.0f },
	{ 31.577415, 17.160225, 75.449150, 255.0f },
	{ 32.991901, 17.323423, 77.887962, 255.0f },
	{ 34.438515, 17.439705, 80.324997, 255.0f },
	{ 35.918789, 17.506771, 82.757187, 255.0f },
	{ 37.430176, 17.528189, 85.172806, 255.0f },
	{ 38.973946, 17.502434, 87.568016, 255.0f },
	{ 40.549587, 17.430271, 89.935440, 255.0f },
	{ 42.153542, 17.317305, 92.263077, 255.0f },
	{ 43.786812, 17.162775, 94.546600, 255.0f },
	{ 45.444061, 16.976879, 96.771736, 255.0f },
	{ 47.124256, 16.761662, 98.933121, 255.0f },
	{ 48.822300, 16.528591, 101.018761, 255.0f },
	{ 50.535133, 16.284811, 103.022301, 255.0f },
	{ 52.258427, 16.041286, 104.936073, 255.0f },
	{ 53.988087, 15.807961, 106.754982, 255.0f },
	{ 55.720558, 15.595290, 108.474960, 255.0f },
	{ 57.452007, 15.413475, 110.094215, 255.0f },
	{ 59.179634, 15.271695, 111.612221, 255.0f },
	{ 60.900631, 15.176835, 113.030281, 255.0f },
	{ 62.613464, 15.134760, 114.351181, 255.0f },
	{ 64.316101, 15.150826, 115.578239, 255.0f },
	{ 66.008537, 15.225030, 116.716049, 255.0f },
	{ 67.688980, 15.360435, 117.769203, 255.0f },
	{ 69.358467, 15.553470, 118.743301, 255.0f },
	{ 71.015709, 15.804390, 119.643448, 255.0f },
	{ 72.662506, 16.107840, 120.475006, 255.0f },
	{ 74.298332, 16.461016, 121.242805, 255.0f },
	{ 75.923706, 16.859837, 121.951965, 255.0f },
	{ 77.540649, 17.297926, 122.607063, 255.0f },
	{ 79.147415, 17.774010, 123.212433, 255.0f },
	{ 80.746773, 18.280951, 123.771896, 255.0f },
	{ 82.339249, 18.814409, 124.289040, 255.0f },
	{ 83.924065, 19.372860, 124.768181, 255.0f },
	{ 85.503540, 19.950180, 125.211121, 255.0f },
	{ 87.077911, 20.543819, 125.620903, 255.0f },
	{ 88.647186, 21.151230, 126.000854, 255.0f },
	{ 90.212112, 21.770115, 126.352760, 255.0f },
	{ 91.773987, 22.396904, 126.678391, 255.0f },
	{ 93.333061, 23.030069, 126.979797, 255.0f },
	{ 94.889580, 23.668081, 127.258514, 255.0f },
	{ 96.443802, 24.309660, 127.517082, 255.0f },
	{ 97.996246, 24.953026, 127.755516, 255.0f },
	{ 99.547920, 25.596643, 127.975327, 255.0f },
	{ 101.099083, 26.240011, 128.177795, 255.0f },
	{ 102.649734, 26.882101, 128.363434, 255.0f },
	{ 104.200394, 27.522150, 128.533249, 255.0f },
	{ 105.750793, 28.159904, 128.688797, 255.0f },
	{ 107.301704, 28.794600, 128.829819, 255.0f },
	{ 108.853630, 29.425726, 128.957077, 255.0f },
	{ 110.406586, 30.053024, 129.070801, 255.0f },
	{ 111.960808, 30.675989, 129.171524, 255.0f },
	{ 113.516571, 31.294619, 129.259766, 255.0f },
	{ 115.074104, 31.908659, 129.335480, 255.0f },
	{ 116.633430, 32.518112, 129.399246, 255.0f },
	{ 118.194542, 33.122715, 129.451263, 255.0f },
	{ 119.758194, 33.722477, 129.491287, 255.0f },
	{ 121.323906, 34.317135, 129.519852, 255.0f },
	{ 122.891899, 34.907207, 129.537186, 255.0f },
	{ 124.462440, 35.492428, 129.542801, 255.0f },
	{ 126.035789, 36.072811, 129.536926, 255.0f },
	{ 127.611687, 36.648346, 129.519608, 255.0f },
	{ 129.190399, 37.219292, 129.490524, 255.0f },
	{ 130.771896, 37.785645, 129.450241, 255.0f },
	{ 132.356476, 38.347664, 129.397964, 255.0f },
	{ 133.943848, 38.905094, 129.333969, 255.0f },
	{ 135.534286, 39.458447, 129.258224, 255.0f },
	{ 137.127533, 40.007969, 129.170517, 255.0f },
	{ 138.723816, 40.553413, 129.070541, 255.0f },
	{ 140.323181, 41.095287, 128.958344, 255.0f },
	{ 141.925613, 41.633595, 128.833649, 255.0f },
	{ 143.530823, 42.168842, 128.696472, 255.0f },
	{ 145.138870, 42.700771, 128.546768, 255.0f },
	{ 146.749954, 43.230152, 128.383835, 255.0f },
	{ 148.363846, 43.756981, 128.208130, 255.0f },
	{ 149.980286, 44.281258, 128.018936, 255.0f },
	{ 151.599533, 44.803757, 127.816460, 255.0f },
	{ 153.221344, 45.324467, 127.600464, 255.0f },
	{ 154.845688, 45.843643, 127.370461, 255.0f },
	{ 156.472336, 46.361805, 127.126678, 255.0f },
	{ 158.101273, 46.879200, 126.868622, 255.0f },
	{ 159.732254, 47.396084, 126.596283, 255.0f },
	{ 161.365265, 47.912716, 126.309662, 255.0f },
	{ 163.000076, 48.429855, 126.008255, 255.0f },
	{ 164.636414, 48.947762, 125.692047, 255.0f },
	{ 166.274277, 49.466431, 125.360809, 255.0f },
	{ 167.913177, 49.986885, 125.014519, 255.0f },
	{ 169.553329, 50.509125, 124.653175, 255.0f },
	{ 171.193985, 51.033913, 124.276291, 255.0f },
	{ 172.835434, 51.561768, 123.883850, 255.0f },
	{ 174.477127, 52.092930, 123.475845, 255.0f },
	{ 176.118561, 52.627922, 123.052292, 255.0f },
	{ 177.759995, 53.167755, 122.612923, 255.0f },
	{ 179.400650, 53.712692, 122.157494, 255.0f },
	{ 181.040314, 54.263237, 121.686256, 255.0f },
	{ 182.678680, 54.820412, 121.198952, 255.0f },
	{ 184.315277, 55.384472, 120.695587, 255.0f },
	{ 185.950073, 55.956436, 120.176147, 255.0f },
	{ 187.582092, 56.536816, 119.640900, 255.0f },
	{ 189.211014, 57.126373, 119.089592, 255.0f },
	{ 190.836380, 57.726135, 118.522476, 255.0f },
	{ 192.457947, 58.336861, 117.939796, 255.0f },
	{ 194.074631, 58.959572, 117.341316, 255.0f },
	{ 195.686493, 59.594776, 116.727524, 255.0f },
	{ 197.292221, 60.243496, 116.098694, 255.0f },
	{ 198.891846, 60.907005, 115.455070, 255.0f },
	{ 200.484070, 61.586071, 114.796913, 255.0f },
	{ 202.068893, 62.281708, 114.123466, 255.0f },
	{ 203.645035, 62.995201, 113.436241, 255.0f },
	{ 205.211761, 63.727303, 112.736008, 255.0f },
	{ 206.768021, 64.479553, 112.022774, 255.0f },
	{ 208.313080, 65.253220, 111.297554, 255.0f },
	{ 209.846130, 66.049080, 110.561119, 255.0f },
	{ 211.365921, 66.868393, 109.814224, 255.0f },
	{ 212.871704, 67.712700, 109.056099, 255.0f },
	{ 214.362183, 68.583015, 108.289825, 255.0f },
	{ 215.836075, 69.480614, 107.515907, 255.0f },
	{ 217.292130, 70.407028, 106.736115, 255.0f },
	{ 218.729568, 71.363541, 105.951477, 255.0f },
	{ 220.146591, 72.350891, 105.162766, 255.0f },
	{ 221.542221, 73.370644, 104.372269, 255.0f },
	{ 222.914886, 74.424042, 103.582275, 255.0f },
	{ 224.263306, 75.511871, 102.795097, 255.0f },
	{ 225.586014, 76.635147, 102.011986, 255.0f },
	{ 226.881409, 77.795151, 101.235512, 255.0f },
	{ 228.148499, 78.992111, 100.468719, 255.0f },
	{ 229.385757, 80.227081, 99.714432, 255.0f },
	{ 230.591660, 81.500549, 98.974937, 255.0f },
	{ 231.765411, 82.812531, 98.253540, 255.0f },
	{ 232.905258, 84.163254, 97.553566, 255.0f },
	{ 234.010696, 85.552498, 96.878326, 255.0f },
	{ 235.080414, 86.979996, 96.230881, 255.0f },
	{ 236.113937, 88.445213, 95.614540, 255.0f },
	{ 237.110474, 89.947166, 95.032631, 255.0f },
	{ 238.069534, 91.484818, 94.487953, 255.0f },
	{ 238.991348, 93.056892, 93.984581, 255.0f },
	{ 239.875183, 94.662117, 93.524315, 255.0f },
	{ 240.721542, 96.298965, 93.109680, 255.0f },
	{ 241.530899, 97.965393, 92.743752, 255.0f },
	{ 242.303543, 99.659096, 92.429344, 255.0f },
	{ 243.040253, 101.378571, 92.166695, 255.0f },
	{ 243.741486, 103.121994, 91.957848, 255.0f },
	{ 244.408325, 104.887619, 91.803566, 255.0f },
	{ 245.041992, 106.672371, 91.705650, 255.0f },
	{ 245.644058, 108.474449, 91.664597, 255.0f },
	{ 246.214996, 110.292343, 91.679893, 255.0f },
	{ 246.756104, 112.124260, 91.751549, 255.0f },
	{ 247.268402, 113.968681, 91.879303, 255.0f },
	{ 247.753403, 115.823555, 92.062653, 255.0f },
	{ 248.212158, 117.687599, 92.301079, 255.0f },
	{ 248.645905, 119.559555, 92.593300, 255.0f },
	{ 249.055954, 121.437630, 92.938835, 255.0f },
	{ 249.443542, 123.321060, 93.336372, 255.0f },
	{ 249.809479, 125.208572, 93.784668, 255.0f },
	{ 250.154999, 127.099136, 94.282166, 255.0f },
	{ 250.481140, 128.992004, 94.827873, 255.0f },
	{ 250.788666, 130.886398, 95.420486, 255.0f },
	{ 251.078613, 132.781815, 96.057983, 255.0f },
	{ 251.351715, 134.677734, 96.739601, 255.0f },
	{ 251.608505, 136.573410, 97.463547, 255.0f },
	{ 251.849731, 138.468826, 98.228554, 255.0f },
	{ 252.075928, 140.363724, 99.033073, 255.0f },
	{ 252.287567, 142.257614, 99.876106, 255.0f },
	{ 252.485184, 144.150482, 100.756111, 255.0f },
	{ 252.672104, 146.040024, 101.672073, 255.0f },
	{ 252.847290, 147.927277, 102.622452, 255.0f },
	{ 253.009979, 149.813004, 103.606247, 255.0f },
	{ 253.160172, 151.697205, 104.622162, 255.0f },
	{ 253.298126, 153.580124, 105.669449, 255.0f },
	{ 253.427673, 155.459213, 106.746315, 255.0f },
	{ 253.548798, 157.334732, 107.852249, 255.0f },
	{ 253.658188, 159.209259, 108.986237, 255.0f },
	{ 253.756119, 161.082474, 110.147499, 255.0f },
	{ 253.847397, 162.951889, 111.334785, 255.0f },
	{ 253.931549, 164.817719, 112.547058, 255.0f },
	{ 254.004486, 166.683044, 113.784317, 255.0f },
	{ 254.066956, 168.547104, 115.045807, 255.0f },
	{ 254.127899, 170.405273, 116.328957, 255.0f },
	{ 254.177612, 172.262955, 117.635071, 255.0f },
	{ 254.215881, 174.121140, 118.964134, 255.0f },
	{ 254.254639, 175.972427, 120.311806, 255.0f },
	{ 254.282425, 177.824005, 121.681412, 255.0f },
	{ 254.299774, 179.675812, 123.071922, 255.0f },
	{ 254.317871, 181.521240, 124.479271, 255.0f },
	{ 254.324509, 183.367691, 125.907532, 255.0f },
	{ 254.324509, 185.212631, 127.354141, 255.0f },
	{ 254.321945, 187.053970, 128.817581, 255.0f },
	{ 254.307678, 188.896866, 130.300659, 255.0f },
	{ 254.293152, 190.735153, 131.799042, 255.0f },
	{ 254.270203, 192.573456, 133.315521, 255.0f },
	{ 254.239838, 194.411484, 134.849350, 255.0f },
	{ 254.208984, 196.245697, 136.397461, 255.0f },
	{ 254.165375, 198.082733, 137.964935, 255.0f },
	{ 254.125610, 199.914124, 139.544418, 255.0f },
	{ 254.074097, 201.747589, 141.142242, 255.0f },
	{ 254.021317, 203.578735, 142.754105, 255.0f },
	{ 253.962662, 205.409378, 144.381500, 255.0f },
	{ 253.898392, 207.240021, 146.024475, 255.0f },
	{ 253.833115, 209.068130, 147.680695, 255.0f },
	{ 253.758408, 210.898254, 149.353760, 255.0f },
	{ 253.686996, 212.724319, 151.038284, 255.0f },
	{ 253.603622, 214.553680, 152.740662, 255.0f },
	{ 253.526611, 216.377701, 154.452484, 255.0f },
	{ 253.435837, 218.206299, 156.182907, 255.0f },
	{ 253.353973, 220.029053, 157.921249, 255.0f },
	{ 253.258362, 221.856125, 159.678192, 255.0f },
	{ 253.171906, 223.677841, 161.442795, 255.0f },
	{ 253.072189, 225.504150, 163.225235, 255.0f },
	{ 252.982681, 227.324860, 165.014587, 255.0f },
	{ 252.880447, 229.149887, 166.821503, 255.0f },
	{ 252.789658, 230.969559, 168.633789, 255.0f },
	{ 252.687149, 232.793320, 170.462646, 255.0f },
	{ 252.595352, 234.612503, 172.297119, 255.0f },
	{ 252.494629, 236.434982, 174.146133, 255.0f },
	{ 252.402817, 238.253891, 176.000488, 255.0f },
	{ 252.305664, 240.074860, 177.867340, 255.0f },
	{ 252.214630, 241.894012, 179.740067, 255.0f },
	{ 252.122833, 243.714203, 181.621719, 255.0f },
	{ 252.033585, 245.533890, 183.510498, 255.0f },
	{ 251.948410, 247.353058, 185.404633, 255.0f },
	{ 251.861206, 249.174271, 187.306671, 255.0f },
	{ 251.783691, 250.993439, 189.210510, 255.0f },
	{ 251.698502, 252.816681, 191.123535, 255.0f },
	{ 53.065502, 42.406498, 134.945999, 255.0f },
	{ 53.320499, 43.885498, 137.980499, 255.0f },
	{ 53.575500, 45.364502, 141.014999, 255.0f },
	{ 53.779499, 46.843498, 144.074997, 255.0f },
	{ 53.958000, 48.322502, 147.160492, 255.0f },
	{ 54.085499, 49.827000, 150.246002, 255.0f },
	{ 54.162003, 51.331497, 153.331497, 255.0f },
	{ 54.187500, 52.836002, 156.442505, 255.0f },
	{ 54.136501, 54.366001, 159.579010, 255.0f },
	{ 54.008999, 55.896000, 162.715500, 255.0f },
	{ 53.830498, 57.451500, 165.877502, 255.0f },
	{ 53.524502, 59.032501, 169.039490, 255.0f },
	{ 53.141998, 60.613499, 172.201508, 255.0f },
	{ 52.606503, 62.220001, 175.388992, 255.0f },
	{ 51.968998, 63.826496, 178.576492, 255.0f },
	{ 51.153000, 65.484001, 181.789490, 255.0f },
	{ 50.183998, 67.116005, 185.002502, 255.0f },
	{ 48.985500, 68.799004, 188.215500, 255.0f },
	{ 47.608501, 70.482002, 191.428497, 255.0f },
	{ 45.951000, 72.215996, 194.667007, 255.0f },
	{ 44.064003, 74.000999, 197.931000, 255.0f },
	{ 41.845501, 75.862503, 201.194992, 255.0f },
	{ 39.295502, 77.826004, 204.433502, 255.0f },
	{ 36.388500, 79.865997, 207.697495, 255.0f },
	{ 33.022499, 82.033501, 210.859497, 255.0f },
	{ 29.248499, 84.303001, 213.868500, 255.0f },
	{ 25.143000, 86.623505, 216.622498, 255.0f },
	{ 20.808001, 88.892998, 218.994003, 255.0f },
	{ 16.473000, 91.085999, 220.932007, 255.0f },
	{ 12.291000, 93.100502, 222.411011, 255.0f },
	{ 8.389501, 94.961998, 223.507507, 255.0f },
	{ 5.431500, 96.695999, 224.298004, 255.0f },
	{ 3.468000, 98.251503, 224.782501, 255.0f },
	{ 2.193000, 99.730499, 225.088501, 255.0f },
	{ 1.530000, 101.107498, 225.241501, 255.0f },
	{ 1.300500, 102.433495, 225.266998, 255.0f },
	{ 1.377000, 103.682999, 225.190491, 255.0f },
	{ 1.708500, 104.881500, 225.037491, 255.0f },
	{ 2.269500, 106.054497, 224.807999, 255.0f },
	{ 2.958000, 107.176498, 224.527512, 255.0f },
	{ 3.774000, 108.273003, 224.221497, 255.0f },
	{ 4.692000, 109.343994, 223.864502, 255.0f },
	{ 5.686500, 110.389503, 223.456497, 255.0f },
	{ 6.732000, 111.435005, 223.048508, 255.0f },
	{ 7.803000, 112.455002, 222.589508, 255.0f },
	{ 8.899500, 113.449501, 222.130508, 255.0f },
	{ 10.047000, 114.444000, 221.645996, 255.0f },
	{ 11.143499, 115.413002, 221.136002, 255.0f },
	{ 12.163500, 116.382004, 220.625992, 255.0f },
	{ 13.106999, 117.351006, 220.115997, 255.0f },
	{ 13.999500, 118.320000, 219.580505, 255.0f },
	{ 14.841001, 119.263504, 219.019501, 255.0f },
	{ 15.606000, 120.207001, 218.484009, 255.0f },
	{ 16.320002, 121.150505, 217.923004, 255.0f },
	{ 16.983000, 122.094002, 217.387512, 255.0f },
	{ 17.569500, 123.037498, 216.826508, 255.0f },
	{ 18.105001, 123.981003, 216.265503, 255.0f },
	{ 18.589499, 124.924500, 215.730011, 255.0f },
	{ 19.023001, 125.893501, 215.194504, 255.0f },
	{ 19.405500, 126.836998, 214.658997, 255.0f },
	{ 19.711500, 127.806007, 214.149002, 255.0f },
	{ 19.941000, 128.800507, 213.639008, 255.0f },
	{ 20.119501, 129.769501, 213.154495, 255.0f },
	{ 20.247002, 130.789505, 212.695496, 255.0f },
	{ 20.272499, 131.809494, 212.262009, 255.0f },
	{ 20.221500, 132.855011, 211.854004, 255.0f },
	{ 20.094000, 133.900497, 211.471497, 255.0f },
	{ 19.838999, 135.022507, 211.139999, 255.0f },
	{ 19.481998, 136.144501, 210.885010, 255.0f },
	{ 19.023001, 137.291992, 210.655502, 255.0f },
	{ 18.462002, 138.490494, 210.451492, 255.0f },
	{ 17.799000, 139.714508, 210.298492, 255.0f },
	{ 17.034000, 140.938492, 210.196503, 255.0f },
	{ 16.218000, 142.213501, 210.094498, 255.0f },
	{ 15.299999, 143.488495, 210.043503, 255.0f },
	{ 14.331000, 144.763504, 209.967010, 255.0f },
	{ 13.336499, 146.038513, 209.890488, 255.0f },
	{ 12.342000, 147.313507, 209.813995, 255.0f },
	{ 11.347500, 148.563004, 209.686508, 255.0f },
	{ 10.404000, 149.787003, 209.533493, 255.0f },
	{ 9.486000, 151.011002, 209.329498, 255.0f },
	{ 8.721001, 152.184006, 209.049011, 255.0f },
	{ 8.083500, 153.306000, 208.742996, 255.0f },
	{ 7.548000, 154.402496, 208.360504, 255.0f },
	{ 7.114500, 155.473511, 207.927002, 255.0f },
	{ 6.757500, 156.493500, 207.442490, 255.0f },
	{ 6.502500, 157.488007, 206.906998, 255.0f },
	{ 6.324000, 158.457001, 206.320496, 255.0f },
	{ 6.196500, 159.375000, 205.682999, 255.0f },
	{ 6.094500, 160.267502, 204.994507, 255.0f },
	{ 6.043500, 161.134506, 204.255005, 255.0f },
	{ 5.992500, 161.976013, 203.489990, 255.0f },
	{ 5.941500, 162.792007, 202.673996, 255.0f },
	{ 5.890500, 163.582504, 201.858002, 255.0f },
	{ 5.865000, 164.347504, 200.965500, 255.0f },
	{ 5.839500, 165.087006, 200.072998, 255.0f },
	{ 5.788500, 165.826508, 199.154999, 255.0f },
	{ 5.788500, 166.540497, 198.211502, 255.0f },
	{ 5.916000, 167.228989, 197.242508, 255.0f },
	{ 6.069000, 167.917511, 196.247986, 255.0f },
	{ 6.273000, 168.580490, 195.228012, 255.0f },
	{ 6.706500, 169.243500, 194.182495, 255.0f },
	{ 7.191000, 169.906494, 193.136993, 255.0f },
	{ 7.803000, 170.544006, 192.065994, 255.0f },
	{ 8.618999, 171.155991, 190.995010, 255.0f },
	{ 9.511500, 171.793488, 189.873001, 255.0f },
	{ 10.659000, 172.405502, 188.750992, 255.0f },
	{ 11.908501, 172.991989, 187.629013, 255.0f },
	{ 13.158000, 173.604004, 186.481506, 255.0f },
	{ 14.637000, 174.190491, 185.308502, 255.0f },
	{ 16.039499, 174.777008, 184.135498, 255.0f },
	{ 17.646000, 175.363495, 182.911499, 255.0f },
	{ 19.252499, 175.924500, 181.712997, 255.0f },
	{ 20.910000, 176.485504, 180.488998, 255.0f },
	{ 22.669500, 177.046494, 179.239502, 255.0f },
	{ 24.378000, 177.607498, 177.964493, 255.0f },
	{ 26.290501, 178.143005, 176.689499, 255.0f },
	{ 28.152000, 178.678497, 175.388992, 255.0f },
	{ 30.090000, 179.213989, 174.088501, 255.0f },
	{ 32.078999, 179.749512, 172.762497, 255.0f },
	{ 34.042500, 180.259506, 171.436493, 255.0f },
	{ 36.159000, 180.769501, 170.059494, 255.0f },
	{ 38.224503, 181.279495, 168.707993, 255.0f },
	{ 40.417500, 181.789490, 167.305496, 255.0f },
	{ 42.610500, 182.274002, 165.928497, 255.0f },
	{ 44.828999, 182.783997, 164.500504, 255.0f },
	{ 47.149502, 183.242996, 163.072510, 255.0f },
	{ 49.418999, 183.727493, 161.619003, 255.0f },
	{ 51.841499, 184.186493, 160.165497, 255.0f },
	{ 54.264000, 184.645493, 158.686508, 255.0f },
	{ 56.711998, 185.104492, 157.207504, 255.0f },
	{ 59.262001, 185.512512, 155.728500, 255.0f },
	{ 61.786503, 185.945999, 154.223999, 255.0f },
	{ 64.438499, 186.353989, 152.694000, 255.0f },
	{ 67.090500, 186.761993, 151.189499, 255.0f },
	{ 69.742500, 187.144501, 149.659500, 255.0f },
	{ 72.547501, 187.527008, 148.129501, 255.0f },
	{ 75.301498, 187.884003, 146.599487, 255.0f },
	{ 78.132004, 188.215500, 145.069504, 255.0f },
	{ 81.013496, 188.547012, 143.565002, 255.0f },
	{ 83.869499, 188.852997, 142.034988, 255.0f },
	{ 86.827499, 189.133499, 140.556000, 255.0f },
	{ 89.760002, 189.414001, 139.051498, 255.0f },
	{ 92.692497, 189.668991, 137.598007, 255.0f },
	{ 95.701500, 189.873001, 136.144501, 255.0f },
	{ 98.659500, 190.076996, 134.716492, 255.0f },
	{ 101.643005, 190.255508, 133.339493, 255.0f },
	{ 104.626495, 190.408493, 131.962494, 255.0f },
	{ 107.558998, 190.561508, 130.636505, 255.0f },
	{ 110.516998, 190.663498, 129.335999, 255.0f },
	{ 113.398499, 190.791000, 128.035492, 255.0f },
	{ 116.305496, 190.867493, 126.786003, 255.0f },
	{ 119.136002, 190.918503, 125.561996, 255.0f },
	{ 121.966499, 190.969498, 124.363495, 255.0f },
	{ 124.746002, 191.020508, 123.190498, 255.0f },
	{ 127.500000, 191.020508, 122.042999, 255.0f },
	{ 130.202988, 191.045990, 120.895500, 255.0f },
	{ 132.906006, 191.045990, 119.798996, 255.0f },
	{ 135.532501, 191.020508, 118.702499, 255.0f },
	{ 138.159012, 190.995010, 117.631493, 255.0f },
	{ 140.734512, 190.969498, 116.560501, 255.0f },
	{ 143.284500, 190.918503, 115.540497, 255.0f },
	{ 145.809006, 190.867493, 114.495003, 255.0f },
	{ 148.307999, 190.791000, 113.500504, 255.0f },
	{ 150.781509, 190.714508, 112.505997, 255.0f },
	{ 153.229492, 190.638000, 111.537003, 255.0f },
	{ 155.626495, 190.561508, 110.542496, 255.0f },
	{ 158.023499, 190.459503, 109.598999, 255.0f },
	{ 160.395004, 190.357498, 108.655495, 255.0f },
	{ 162.740997, 190.229996, 107.711998, 255.0f },
	{ 165.061508, 190.127991, 106.793999, 255.0f },
	{ 167.382004, 190.000504, 105.875999, 255.0f },
	{ 169.651505, 189.873001, 104.958000, 255.0f },
	{ 171.921005, 189.745499, 104.065506, 255.0f },
	{ 174.165009, 189.592499, 103.172997, 255.0f },
	{ 176.408997, 189.464996, 102.280502, 255.0f },
	{ 178.602005, 189.311996, 101.388000, 255.0f },
	{ 180.820496, 189.158997, 100.520996, 255.0f },
	{ 182.987991, 189.005997, 99.653999, 255.0f },
	{ 185.155502, 188.827499, 98.787003, 255.0f },
	{ 187.322998, 188.674500, 97.919998, 255.0f },
	{ 189.464996, 188.496002, 97.053001, 255.0f },
	{ 191.581497, 188.317505, 96.211502, 255.0f },
	{ 193.697998, 188.139008, 95.344498, 255.0f },
	{ 195.814499, 187.986008, 94.502998, 255.0f },
	{ 197.905502, 187.781998, 93.661499, 255.0f },
	{ 199.996506, 187.603500, 92.794502, 255.0f },
	{ 202.061996, 187.425003, 91.952995, 255.0f },
	{ 204.127487, 187.246506, 91.111504, 255.0f },
	{ 206.167496, 187.068008, 90.244499, 255.0f },
	{ 208.233002, 186.889511, 89.403000, 255.0f },
	{ 210.272995, 186.711014, 88.536003, 255.0f },
	{ 212.287491, 186.532501, 87.668999, 255.0f },
	{ 214.327499, 186.353989, 86.802002, 255.0f },
	{ 216.341995, 186.175491, 85.935005, 255.0f },
	{ 218.356506, 185.996994, 85.068001, 255.0f },
	{ 220.371002, 185.843994, 84.150002, 255.0f },
	{ 222.360001, 185.691010, 83.257500, 255.0f },
	{ 224.348999, 185.537994, 82.339500, 255.0f },
	{ 226.363510, 185.410507, 81.421501, 255.0f },
	{ 228.326996, 185.283005, 80.478004, 255.0f },
	{ 230.315994, 185.181000, 79.483498, 255.0f },
	{ 232.305008, 185.104492, 78.488998, 255.0f },
	{ 234.268494, 185.028000, 77.468994, 255.0f },
	{ 236.231995, 185.028000, 76.398003, 255.0f },
	{ 238.195496, 185.028000, 75.301498, 255.0f },
	{ 240.133499, 185.104492, 74.128494, 255.0f },
	{ 242.071503, 185.232010, 72.904503, 255.0f },
	{ 243.958511, 185.461502, 71.604004, 255.0f },
	{ 245.794510, 185.767502, 70.227005, 255.0f },
	{ 247.554001, 186.226501, 68.748001, 255.0f },
	{ 249.211502, 186.812988, 67.167000, 255.0f },
	{ 250.690506, 187.552490, 65.534996, 255.0f },
	{ 251.990997, 188.445007, 63.852001, 255.0f },
	{ 253.011002, 189.490494, 62.143501, 255.0f },
	{ 253.776001, 190.638000, 60.511497, 255.0f },
	{ 254.311508, 191.862000, 58.905003, 255.0f },
	{ 254.643005, 193.111511, 57.400497, 255.0f },
	{ 254.770508, 194.411987, 55.972500, 255.0f },
	{ 254.745010, 195.712494, 54.595501, 255.0f },
	{ 254.617493, 197.013000, 53.295002, 255.0f },
	{ 254.388000, 198.339005, 52.070999, 255.0f },
	{ 254.082001, 199.639496, 50.872498, 255.0f },
	{ 253.725006, 200.940002, 49.699501, 255.0f },
	{ 253.291504, 202.240494, 48.577503, 255.0f },
	{ 252.807007, 203.515503, 47.506500, 255.0f },
	{ 252.297012, 204.815994, 46.435501, 255.0f },
	{ 251.761490, 206.116501, 45.389999, 255.0f },
	{ 251.200485, 207.391510, 44.369999, 255.0f },
	{ 250.613998, 208.692001, 43.350002, 255.0f },
	{ 250.027496, 209.992493, 42.355499, 255.0f },
	{ 249.441010, 211.292999, 41.361000, 255.0f },
	{ 248.854492, 212.593506, 40.366501, 255.0f },
	{ 248.267990, 213.919510, 39.372002, 255.0f },
	{ 247.681503, 215.245499, 38.377499, 255.0f },
	{ 247.146011, 216.597000, 37.357502, 255.0f },
	{ 246.636002, 217.973999, 36.337498, 255.0f },
	{ 246.177002, 219.376495, 35.317501, 255.0f },
	{ 245.768997, 220.804489, 34.246498, 255.0f },
	{ 245.386505, 222.257996, 33.175499, 255.0f },
	{ 245.080490, 223.737000, 32.078999, 255.0f },
	{ 244.799988, 225.266998, 30.982500, 255.0f },
	{ 244.621490, 226.822510, 29.860500, 255.0f },
	{ 244.494003, 228.429001, 28.712999, 255.0f },
	{ 244.442993, 230.060989, 27.591000, 255.0f },
	{ 244.468506, 231.744003, 26.418001, 255.0f },
	{ 244.570496, 233.452499, 25.244999, 255.0f },
	{ 244.774506, 235.237503, 24.072001, 255.0f },
	{ 245.055008, 237.048004, 22.873499, 255.0f },
	{ 245.412003, 238.884003, 21.675001, 255.0f },
	{ 245.845505, 240.796494, 20.451000, 255.0f },
	{ 246.380997, 242.709000, 19.201500, 255.0f },
	{ 246.967499, 244.672501, 17.926500, 255.0f },
	{ 247.605011, 246.661499, 16.600500, 255.0f },
	{ 248.267990, 248.675995, 15.223500, 255.0f },
	{ 248.956497, 250.690506, 13.719001, 255.0f },
	{ 12.847666, 7.599765, 134.633636, 255.0f },
	{ 16.201681, 7.248630, 135.946625, 255.0f },
	{ 19.215014, 6.937530, 137.191788, 255.0f },
	{ 21.986610, 6.661875, 138.377777, 255.0f },
	{ 24.576645, 6.417075, 139.511261, 255.0f },
	{ 27.024900, 6.198795, 140.598846, 255.0f },
	{ 29.356621, 6.006780, 141.644348, 255.0f },
	{ 31.595264, 5.833890, 142.652878, 255.0f },
	{ 33.757156, 5.675790, 143.628754, 255.0f },
	{ 35.853767, 5.530185, 144.574554, 255.0f },
	{ 37.894787, 5.394270, 145.493317, 255.0f },
	{ 39.887356, 5.266005, 146.386581, 255.0f },
	{ 41.837849, 5.143605, 147.256882, 255.0f },
	{ 43.751369, 5.025030, 148.105530, 255.0f },
	{ 45.632248, 4.909260, 148.933762, 255.0f },
	{ 47.484314, 4.794765, 149.743134, 255.0f },
	{ 49.310368, 4.680270, 150.534149, 255.0f },
	{ 51.113476, 4.565010, 151.307816, 255.0f },
	{ 52.895924, 4.447710, 152.064926, 255.0f },
	{ 54.659248, 4.328115, 152.805939, 255.0f },
	{ 56.405235, 4.206735, 153.531174, 255.0f },
	{ 58.135666, 4.081785, 154.241074, 255.0f },
	{ 59.852325, 3.953010, 154.935959, 255.0f },
	{ 61.555977, 3.819645, 155.616043, 255.0f },
	{ 63.248161, 3.681945, 156.281342, 255.0f },
	{ 64.929886, 3.539910, 156.931839, 255.0f },
	{ 66.601662, 3.393540, 157.567307, 255.0f },
	{ 68.264267, 3.242580, 158.188232, 255.0f },
	{ 69.918701, 3.087795, 158.794113, 255.0f },
	{ 71.565239, 2.929440, 159.384705, 255.0f },
	{ 73.204376, 2.768025, 159.960236, 255.0f },
	{ 74.836891, 2.604315, 160.519958, 255.0f },
	{ 76.463020, 2.438055, 161.064117, 255.0f },
	{ 78.083549, 2.270010, 161.591965, 255.0f },
	{ 79.698463, 2.100945, 162.103500, 255.0f },
	{ 81.308281, 1.931880, 162.598206, 255.0f },
	{ 82.913254, 1.763325, 163.075562, 255.0f },
	{ 84.513626, 1.596555, 163.535583, 255.0f },
	{ 86.109161, 1.432590, 163.977493, 255.0f },
	{ 87.700874, 1.272705, 164.401047, 255.0f },
	{ 89.288246, 1.117410, 164.805984, 255.0f },
	{ 90.871544, 0.968490, 165.191544, 255.0f },
	{ 92.451012, 0.826965, 165.557480, 255.0f },
	{ 94.026909, 0.694620, 165.903259, 255.0f },
	{ 95.598740, 0.572475, 166.228378, 255.0f },
	{ 97.166985, 0.462570, 166.532349, 255.0f },
	{ 98.731667, 0.365670, 166.815140, 255.0f },
	{ 100.292519, 0.284070, 167.075745, 255.0f },
	{ 101.849800, 0.219045, 167.313919, 255.0f },
	{ 103.403267, 0.172890, 167.529129, 255.0f },
	{ 104.952896, 0.147135, 167.721146, 255.0f },
	{ 106.498711, 0.143820, 167.889450, 255.0f },
	{ 108.040695, 0.164730, 168.033783, 255.0f },
	{ 109.578346, 0.211905, 168.153381, 255.0f },
	{ 111.112167, 0.287385, 168.248245, 255.0f },
	{ 112.641655, 0.392700, 168.317596, 255.0f },
	{ 114.167068, 0.530400, 168.361206, 255.0f },
	{ 115.687637, 0.702525, 168.379044, 255.0f },
	{ 117.203865, 0.911370, 168.370636, 255.0f },
	{ 118.715248, 1.158975, 168.335449, 255.0f },
	{ 120.221535, 1.447890, 168.273743, 255.0f },
	{ 121.722725, 1.779900, 168.184998, 255.0f },
	{ 123.218552, 2.157300, 168.069229, 255.0f },
	{ 124.709030, 2.582385, 167.926163, 255.0f },
	{ 126.193634, 3.057450, 167.755569, 255.0f },
	{ 127.672890, 3.584025, 167.557434, 255.0f },
	{ 129.145767, 4.164915, 167.331512, 255.0f },
	{ 130.612534, 4.802415, 167.078293, 255.0f },
	{ 132.072922, 5.498565, 166.797791, 255.0f },
	{ 133.526413, 6.255660, 166.489746, 255.0f },
	{ 134.973022, 7.075485, 166.154434, 255.0f },
	{ 136.412750, 7.960335, 165.792084, 255.0f },
	{ 137.845352, 8.912250, 165.403198, 255.0f },
	{ 139.270035, 9.933270, 164.987564, 255.0f },
	{ 140.687332, 10.999681, 164.545639, 255.0f },
	{ 142.096970, 12.069406, 164.077957, 255.0f },
	{ 143.498184, 13.143975, 163.584793, 255.0f },
	{ 144.891251, 14.223391, 163.066635, 255.0f },
	{ 146.276154, 15.307140, 162.524002, 255.0f },
	{ 147.652405, 16.395479, 161.957123, 255.0f },
	{ 149.019699, 17.487646, 161.367065, 255.0f },
	{ 150.378342, 18.583891, 160.754044, 255.0f },
	{ 151.727798, 19.683449, 160.118835, 255.0f },
	{ 153.067825, 20.786579, 159.462219, 255.0f },
	{ 154.398682, 21.892771, 158.784943, 255.0f },
	{ 155.720078, 23.002020, 158.087509, 255.0f },
	{ 157.032059, 24.113819, 157.370697, 255.0f },
	{ 158.334335, 25.228170, 156.635529, 255.0f },
	{ 159.626678, 26.344561, 155.882782, 255.0f },
	{ 160.909348, 27.463245, 155.113174, 255.0f },
	{ 162.182053, 28.583462, 154.327271, 255.0f },
	{ 163.444550, 29.705462, 153.526581, 255.0f },
	{ 164.697357, 30.828991, 152.711090, 255.0f },
	{ 165.940231, 31.953796, 151.882339, 255.0f },
	{ 167.172897, 33.079872, 151.040833, 255.0f },
	{ 168.395370, 34.206718, 150.187607, 255.0f },
	{ 169.607895, 35.334332, 149.323410, 255.0f },
	{ 170.810471, 36.462963, 148.449265, 255.0f },
	{ 172.003113, 37.591846, 147.565445, 255.0f },
	{ 173.185806, 38.721241, 146.673187, 255.0f },
	{ 174.358292, 39.850891, 145.773300, 255.0f },
	{ 175.521088, 40.980793, 144.866272, 255.0f },
	{ 176.674194, 42.110954, 143.953110, 255.0f },
	{ 177.817612, 43.241112, 143.034348, 255.0f },
	{ 178.951096, 44.371277, 142.110474, 255.0f },
	{ 180.075394, 45.501434, 141.182541, 255.0f },
	{ 181.189987, 46.631340, 140.251022, 255.0f },
	{ 182.295166, 47.761246, 139.316193, 255.0f },
	{ 183.391159, 48.890892, 138.379059, 255.0f },
	{ 184.478210, 50.020290, 137.440155, 255.0f },
	{ 185.555847, 51.149433, 136.499710, 255.0f },
	{ 186.624817, 52.278316, 135.558258, 255.0f },
	{ 187.684845, 53.406944, 134.616547, 255.0f },
	{ 188.736465, 54.535320, 133.675079, 255.0f },
	{ 189.779160, 55.663441, 132.733627, 255.0f },
	{ 190.813690, 56.791306, 131.792679, 255.0f },
	{ 191.839554, 57.918915, 130.852997, 255.0f },
	{ 192.857529, 59.046524, 129.914352, 255.0f },
	{ 193.867310, 60.173878, 128.977463, 255.0f },
	{ 194.869217, 61.300980, 128.042130, 255.0f },
	{ 195.862946, 62.428337, 127.108574, 255.0f },
	{ 196.849289, 63.555435, 126.177315, 255.0f },
	{ 197.827972, 64.682793, 125.248604, 255.0f },
	{ 198.799026, 65.809891, 124.322441, 255.0f },
	{ 199.762665, 66.937500, 123.399094, 255.0f },
	{ 200.718903, 68.065109, 122.478287, 255.0f },
	{ 201.668030, 69.192970, 121.560028, 255.0f },
	{ 202.609985, 70.321350, 120.644836, 255.0f },
	{ 203.545074, 71.450233, 119.732193, 255.0f },
	{ 204.473038, 72.579636, 118.822601, 255.0f },
	{ 205.394089, 73.709534, 117.915825, 255.0f },
	{ 206.308258, 74.840210, 117.011848, 255.0f },
	{ 207.216064, 75.971642, 116.111191, 255.0f },
	{ 208.116714, 77.103836, 115.213081, 255.0f },
	{ 209.011002, 78.237061, 114.318031, 255.0f },
	{ 209.898651, 79.371552, 113.425529, 255.0f },
	{ 210.779938, 80.507072, 112.535583, 255.0f },
	{ 211.654587, 81.643860, 111.648178, 255.0f },
	{ 212.522614, 82.781921, 110.763329, 255.0f },
	{ 213.384247, 83.921776, 109.880775, 255.0f },
	{ 214.239532, 85.062897, 109.001030, 255.0f },
	{ 215.088409, 86.205811, 108.123314, 255.0f },
	{ 215.930939, 87.350502, 107.247643, 255.0f },
	{ 216.766830, 88.497246, 106.374016, 255.0f },
	{ 217.596344, 89.646011, 105.502167, 255.0f },
	{ 218.419479, 90.796829, 104.632111, 255.0f },
	{ 219.236237, 91.949944, 103.763840, 255.0f },
	{ 220.046387, 93.105347, 102.897346, 255.0f },
	{ 220.849899, 94.263298, 102.032135, 255.0f },
	{ 221.646759, 95.424057, 101.168190, 255.0f },
	{ 222.437271, 96.587364, 100.305527, 255.0f },
	{ 223.220871, 97.753487, 99.443878, 255.0f },
	{ 223.997864, 98.922661, 98.583000, 255.0f },
	{ 224.767975, 100.094894, 97.723389, 255.0f },
	{ 225.531189, 101.270447, 96.864304, 255.0f },
	{ 226.287506, 102.449310, 96.005966, 255.0f },
	{ 227.036697, 103.631493, 95.148148, 255.0f },
	{ 227.778748, 104.817238, 94.290840, 255.0f },
	{ 228.513397, 106.006561, 93.433784, 255.0f },
	{ 229.240921, 107.199959, 92.576988, 255.0f },
	{ 229.960785, 108.397186, 91.720444, 255.0f },
	{ 230.673248, 109.598236, 90.863892, 255.0f },
	{ 231.378082, 110.803619, 90.007355, 255.0f },
	{ 232.074997, 112.013336, 89.150551, 255.0f },
	{ 232.764008, 113.227394, 88.294006, 255.0f },
	{ 233.445114, 114.445786, 87.436951, 255.0f },
	{ 234.117798, 115.668762, 86.579895, 255.0f },
	{ 234.782074, 116.896332, 85.722328, 255.0f },
	{ 235.438171, 118.129005, 84.864258, 255.0f },
	{ 236.085373, 119.366264, 84.005920, 255.0f },
	{ 236.723892, 120.608620, 83.147087, 255.0f },
	{ 237.353485, 121.856087, 82.287735, 255.0f },
	{ 237.974167, 123.108902, 81.427872, 255.0f },
	{ 238.585663, 124.366562, 80.567764, 255.0f },
	{ 239.187454, 125.630081, 79.706627, 255.0f },
	{ 239.779816, 126.898712, 78.845238, 255.0f },
	{ 240.362488, 128.172943, 77.983078, 255.0f },
	{ 240.935226, 129.452789, 77.120422, 255.0f },
	{ 241.498001, 130.738251, 76.257492, 255.0f },
	{ 242.050339, 132.029572, 75.393806, 255.0f },
	{ 242.592728, 133.326752, 74.530128, 255.0f },
	{ 243.124130, 134.629807, 73.665169, 255.0f },
	{ 243.644852, 135.938705, 72.799950, 255.0f },
	{ 244.154587, 137.253754, 71.934479, 255.0f },
	{ 244.653122, 138.574905, 71.068756, 255.0f },
	{ 245.140686, 139.902191, 70.202774, 255.0f },
	{ 245.616776, 141.235580, 69.336792, 255.0f },
	{ 246.081116, 142.575089, 68.470810, 255.0f },
	{ 246.533493, 143.920990, 67.605087, 255.0f },
	{ 246.974136, 145.273499, 66.738853, 255.0f },
	{ 247.402283, 146.632141, 65.872879, 255.0f },
	{ 247.817932, 147.997406, 65.007408, 255.0f },
	{ 248.221069, 149.369064, 64.142700, 255.0f },
	{ 248.611481, 150.747070, 63.278507, 255.0f },
	{ 248.989136, 152.131729, 62.415585, 255.0f },
	{ 249.353271, 153.523010, 61.553684, 255.0f },
	{ 249.704422, 154.920670, 60.693314, 255.0f },
	{ 250.041779, 156.324951, 59.834732, 255.0f },
	{ 250.365631, 157.735855, 58.978188, 255.0f },
	{ 250.675446, 159.153412, 58.123936, 255.0f },
	{ 250.970749, 160.578094, 57.271725, 255.0f },
	{ 251.251755, 162.009155, 56.422577, 255.0f },
	{ 251.517975, 163.447083, 55.576740, 255.0f },
	{ 251.769653, 164.891418, 54.735237, 255.0f },
	{ 252.006287, 166.342865, 53.897820, 255.0f },
	{ 252.227646, 167.800964, 53.065502, 255.0f },
	{ 252.433426, 169.265686, 52.239044, 255.0f },
	{ 252.623657, 170.737289, 51.418713, 255.0f },
	{ 252.798080, 172.215530, 50.605515, 255.0f },
	{ 252.956177, 173.700638, 49.800228, 255.0f },
	{ 253.097961, 175.192657, 49.003349, 255.0f },
	{ 253.223160, 176.691284, 48.216419, 255.0f },
	{ 253.331284, 178.196548, 47.440453, 255.0f },
	{ 253.422562, 179.708954, 46.675964, 255.0f },
	{ 253.496262, 181.227997, 45.924736, 255.0f },
	{ 253.552628, 182.753662, 45.188042, 255.0f },
	{ 253.590866, 184.286209, 44.467155, 255.0f },
	{ 253.611023, 185.825638, 43.763607, 255.0f },
	{ 253.613052, 187.371704, 43.079189, 255.0f },
	{ 253.596222, 188.924408, 42.415424, 255.0f },
	{ 253.560532, 190.483719, 41.774353, 255.0f },
	{ 253.505951, 192.049927, 41.158020, 255.0f },
	{ 253.432007, 193.622513, 40.568459, 255.0f },
	{ 253.337906, 195.202240, 40.007206, 255.0f },
	{ 253.223419, 196.788605, 39.476040, 255.0f },
	{ 253.088776, 198.381577, 38.978024, 255.0f },
	{ 252.933731, 199.980942, 38.515709, 255.0f },
	{ 252.758286, 201.586929, 38.091137, 255.0f },
	{ 252.561951, 203.199051, 37.706852, 255.0f },
	{ 252.344681, 204.817276, 37.364895, 255.0f },
	{ 252.105240, 206.442642, 37.066036, 255.0f },
	{ 251.843353, 208.074387, 36.812565, 255.0f },
	{ 251.559799, 209.712250, 36.607033, 255.0f },
	{ 251.255066, 211.355728, 36.450977, 255.0f },
	{ 250.927917, 213.005325, 36.344639, 255.0f },
	{ 250.576523, 214.662064, 36.287266, 255.0f },
	{ 250.203461, 216.323898, 36.281143, 255.0f },
	{ 249.809219, 217.990845, 36.325516, 255.0f },
	{ 249.388718, 219.665161, 36.416042, 255.0f },
	{ 248.947571, 221.344086, 36.554504, 255.0f },
	{ 248.482971, 223.028610, 36.735554, 255.0f },
	{ 247.995148, 224.718750, 36.955364, 255.0f },
	{ 247.485916, 226.413483, 37.209343, 255.0f },
	{ 246.952957, 228.113815, 37.488571, 255.0f },
	{ 246.399094, 229.818497, 37.785900, 255.0f },
	{ 245.825363, 231.527252, 38.089352, 255.0f },
	{ 245.228653, 233.241364, 38.382599, 255.0f },
	{ 244.615387, 234.958786, 38.649330, 255.0f },
	{ 243.986038, 236.678772, 38.864296, 255.0f },
	{ 243.343185, 238.401535, 38.994858, 255.0f },
	{ 242.690140, 240.126114, 38.995876, 255.0f },
	{ 242.033493, 241.850922, 38.805389, 255.0f },
	{ 241.383499, 243.573456, 38.333637, 255.0f },
	{ 240.758759, 245.288589, 37.449554, 255.0f },
	{ 240.183487, 246.990448, 35.943779, 255.0f },
	{ 239.703827, 248.665283, 33.488132, 255.0f },
	{ 48.437252, 18.298800, 59.203350, 255.0f },
	{ 49.681648, 21.264450, 66.679947, 255.0f },
	{ 50.887802, 24.219900, 74.011200, 255.0f },
	{ 52.058250, 27.162600, 81.202194, 255.0f },
	{ 53.193001, 30.095100, 88.247849, 255.0f },
	{ 54.292049, 33.014851, 95.150703, 255.0f },
	{ 55.355400, 35.921852, 101.908195, 255.0f },
	{ 56.383049, 38.818649, 108.522896, 255.0f },
	{ 57.375000, 41.702702, 114.994804, 255.0f },
	{ 58.331253, 44.576553, 121.323906, 255.0f },
	{ 59.251801, 47.437649, 127.510201, 255.0f },
	{ 60.134098, 50.285999, 133.551147, 255.0f },
	{ 60.983250, 53.124153, 139.449295, 255.0f },
	{ 61.796700, 55.949551, 145.202087, 255.0f },
	{ 62.574448, 58.762203, 150.812103, 255.0f },
	{ 63.316502, 61.564651, 156.279312, 255.0f },
	{ 64.022850, 64.354347, 161.603699, 255.0f },
	{ 64.690948, 67.133850, 166.785309, 255.0f },
	{ 65.325897, 69.900604, 171.821548, 255.0f },
	{ 65.925148, 72.654602, 176.715012, 255.0f },
	{ 66.488701, 75.398399, 181.463089, 255.0f },
	{ 67.014000, 78.129448, 186.068405, 255.0f },
	{ 67.506149, 80.850296, 190.530899, 255.0f },
	{ 67.962601, 83.558395, 194.850601, 255.0f },
	{ 68.380798, 86.253754, 199.027496, 255.0f },
	{ 68.765854, 88.938904, 203.059052, 255.0f },
	{ 69.112656, 91.611298, 206.947800, 255.0f },
	{ 69.426300, 94.273506, 210.691208, 255.0f },
	{ 69.701698, 96.920403, 214.294357, 255.0f },
	{ 69.943947, 99.559654, 217.752151, 255.0f },
	{ 70.147949, 102.183601, 221.064606, 255.0f },
	{ 70.318802, 104.797348, 224.236801, 255.0f },
	{ 70.451393, 107.400902, 227.263641, 255.0f },
	{ 70.550850, 109.991699, 230.147705, 255.0f },
	{ 70.612053, 112.569748, 232.886398, 255.0f },
	{ 70.637550, 115.137596, 235.484848, 255.0f },
	{ 70.629906, 117.690147, 237.937943, 255.0f },
	{ 70.584000, 120.235046, 240.245697, 255.0f },
	{ 70.502396, 122.767204, 242.413208, 255.0f },
	{ 70.387650, 125.286606, 244.435349, 255.0f },
	{ 70.234650, 127.793251, 246.314697, 255.0f },
	{ 70.045952, 130.289703, 248.051254, 255.0f },
	{ 69.821548, 132.775955, 249.642456, 255.0f },
	{ 69.546150, 135.251999, 251.075562, 255.0f },
	{ 69.120300, 137.738251, 252.271500, 255.0f },
	{ 68.538895, 140.237244, 253.222656, 255.0f },
	{ 67.809601, 142.746460, 253.936646, 255.0f },
	{ 66.942596, 145.265854, 254.421158, 255.0f },
	{ 65.948097, 147.792908, 254.683792, 255.0f },
	{ 64.833748, 150.322510, 254.734802, 255.0f },
	{ 63.612301, 152.854660, 254.579254, 255.0f },
	{ 62.288849, 155.389343, 254.227356, 255.0f },
	{ 60.878700, 157.924057, 253.686752, 255.0f },
	{ 59.384399, 160.453659, 252.965103, 255.0f },
	{ 57.823799, 162.978149, 252.070053, 255.0f },
	{ 56.199451, 165.497543, 251.011795, 255.0f },
	{ 54.524097, 168.009308, 249.795456, 255.0f },
	{ 52.805401, 170.508301, 248.428650, 255.0f },
	{ 51.053551, 172.997101, 246.924164, 255.0f },
	{ 49.281300, 175.470596, 245.284500, 255.0f },
	{ 47.493752, 177.926239, 243.519897, 255.0f },
	{ 45.703651, 180.366592, 241.640549, 255.0f },
	{ 43.918652, 182.783997, 239.651550, 255.0f },
	{ 42.148949, 185.181000, 237.560547, 255.0f },
	{ 40.402199, 187.555054, 235.377747, 255.0f },
	{ 38.691151, 189.903595, 233.110809, 255.0f },
	{ 37.023449, 192.221542, 230.764801, 255.0f },
	{ 35.409302, 194.511459, 228.352509, 255.0f },
	{ 33.858902, 196.770752, 225.878998, 255.0f },
	{ 32.379902, 198.994354, 223.354492, 255.0f },
	{ 30.985050, 201.184799, 220.781540, 255.0f },
	{ 29.679449, 203.337006, 218.175446, 255.0f },
	{ 28.475851, 205.450943, 215.538757, 255.0f },
	{ 27.381901, 207.521545, 212.884201, 255.0f },
	{ 26.410349, 209.551346, 210.214355, 255.0f },
	{ 25.566299, 211.535263, 207.541946, 255.0f },
	{ 24.862499, 213.470703, 204.872101, 255.0f },
	{ 24.306601, 215.360260, 202.212463, 255.0f },
	{ 23.911350, 217.196259, 199.573196, 255.0f },
	{ 23.681849, 218.981247, 196.962006, 255.0f },
	{ 23.630850, 220.712708, 194.386505, 255.0f },
	{ 23.765999, 222.388046, 191.854355, 255.0f },
	{ 24.100050, 224.002213, 189.375748, 255.0f },
	{ 24.638100, 225.557709, 186.955811, 255.0f },
	{ 25.392899, 227.052002, 184.602158, 255.0f },
	{ 26.372099, 228.480011, 182.324997, 255.0f },
	{ 27.578249, 229.862106, 180.027451, 255.0f },
	{ 29.003698, 231.216156, 177.610062, 255.0f },
	{ 30.635700, 232.542160, 175.083008, 255.0f },
	{ 32.469151, 233.837555, 172.448853, 255.0f },
	{ 34.491299, 235.102356, 169.717804, 255.0f },
	{ 36.697052, 236.334000, 166.892395, 255.0f },
	{ 39.073650, 237.535049, 163.985397, 255.0f },
	{ 41.613453, 238.702942, 160.999359, 255.0f },
	{ 44.311348, 239.835144, 157.941895, 255.0f },
	{ 47.152050, 240.934204, 154.818146, 255.0f },
	{ 50.130451, 241.997559, 151.638290, 255.0f },
	{ 53.236351, 243.025208, 148.407455, 255.0f },
	{ 56.462101, 244.014603, 145.130707, 255.0f },
	{ 59.794952, 244.965759, 141.815704, 255.0f },
	{ 63.232349, 245.878647, 138.472656, 255.0f },
	{ 66.758995, 246.750748, 135.101547, 255.0f },
	{ 70.372353, 247.584610, 131.715149, 255.0f },
	{ 74.057098, 248.377655, 128.318558, 255.0f },
	{ 77.808151, 249.127350, 124.916855, 255.0f },
	{ 81.615303, 249.833710, 121.517700, 255.0f },
	{ 85.468353, 250.496689, 118.128754, 255.0f },
	{ 89.359650, 251.116348, 114.755096, 255.0f },
	{ 93.281555, 251.690109, 111.404396, 255.0f },
	{ 97.223846, 252.217957, 108.084305, 255.0f },
	{ 101.178902, 252.699905, 104.799896, 255.0f },
	{ 105.133949, 253.133408, 101.556297, 255.0f },
	{ 109.083900, 253.518448, 98.366249, 255.0f },
	{ 113.018555, 253.855042, 95.229752, 255.0f },
	{ 116.927696, 254.140656, 92.157005, 255.0f },
	{ 120.806252, 254.375259, 89.155647, 255.0f },
	{ 124.641449, 254.561401, 86.230804, 255.0f },
	{ 128.423111, 254.691452, 83.387550, 255.0f },
	{ 132.146103, 254.770508, 80.636093, 255.0f },
	{ 135.800247, 254.793442, 77.981552, 255.0f },
	{ 139.377899, 254.762848, 75.431557, 255.0f },
	{ 142.866302, 254.676147, 72.988647, 255.0f },
	{ 146.260361, 254.533356, 70.665596, 255.0f },
	{ 149.547302, 254.334442, 68.464943, 255.0f },
	{ 152.722046, 254.076889, 66.396896, 255.0f },
	{ 155.774399, 253.760712, 64.463997, 255.0f },
	{ 158.694153, 253.383301, 62.676453, 255.0f },
	{ 161.473648, 252.947250, 61.039352, 255.0f },
	{ 164.123108, 252.447449, 59.557800, 255.0f },
	{ 166.754700, 251.876251, 58.229248, 255.0f },
	{ 169.391403, 251.236191, 57.043499, 255.0f },
	{ 172.028091, 250.527313, 55.998001, 255.0f },
	{ 174.659698, 249.749542, 55.085102, 255.0f },
	{ 177.288742, 248.905502, 54.299702, 255.0f },
	{ 179.910141, 248.000244, 53.631599, 255.0f },
	{ 182.521347, 247.031250, 53.078251, 255.0f },
	{ 185.119797, 245.998489, 52.632000, 255.0f },
	{ 187.705505, 244.909653, 52.285198, 255.0f },
	{ 190.273346, 243.762146, 52.035301, 255.0f },
	{ 192.823349, 242.558563, 51.874649, 255.0f },
	{ 195.350403, 241.298843, 51.793049, 255.0f },
	{ 197.857056, 239.988144, 51.790501, 255.0f },
	{ 200.335648, 238.626450, 51.856800, 255.0f },
	{ 202.786194, 237.213745, 51.984299, 255.0f },
	{ 205.206146, 235.752609, 52.170448, 255.0f },
	{ 207.595505, 234.245544, 52.407600, 255.0f },
	{ 209.949142, 232.695145, 52.690651, 255.0f },
	{ 212.264542, 231.098862, 53.009403, 255.0f },
	{ 214.539154, 229.464310, 53.361301, 255.0f },
	{ 216.775497, 227.786407, 53.738701, 255.0f },
	{ 218.963409, 226.070251, 54.136501, 255.0f },
	{ 221.107941, 224.318390, 54.547050, 255.0f },
	{ 223.201492, 222.530853, 54.965252, 255.0f },
	{ 225.244049, 220.710159, 55.383450, 255.0f },
	{ 227.235611, 218.856293, 55.793999, 255.0f },
	{ 229.168503, 216.971848, 56.196899, 255.0f },
	{ 231.042755, 215.059357, 56.579399, 255.0f },
	{ 232.858337, 213.118805, 56.936398, 255.0f },
	{ 234.610199, 211.155289, 57.262798, 255.0f },
	{ 236.298294, 209.163742, 57.553501, 255.0f },
	{ 237.917542, 207.151794, 57.800850, 255.0f },
	{ 239.467957, 205.119446, 57.997200, 255.0f },
	{ 240.946960, 203.066696, 58.139999, 255.0f },
	{ 242.349442, 200.998657, 58.219051, 255.0f },
	{ 243.678009, 198.912750, 58.231800, 255.0f },
	{ 244.924942, 196.811554, 58.168049, 255.0f },
	{ 246.092850, 194.697601, 58.022701, 255.0f },
	{ 247.174042, 192.573456, 57.790649, 255.0f },
	{ 248.173645, 190.439087, 57.466801, 255.0f },
	{ 249.081451, 188.297104, 57.040951, 255.0f },
	{ 249.900009, 186.150009, 56.510548, 255.0f },
	{ 250.636948, 183.957001, 55.890900, 255.0f },
	{ 251.299957, 181.687500, 55.207500, 255.0f },
	{ 251.891556, 179.341507, 54.462898, 255.0f },
	{ 252.414307, 176.924103, 53.659649, 255.0f },
	{ 252.865662, 174.440399, 52.800297, 255.0f },
	{ 253.250702, 171.890396, 51.887402, 255.0f },
	{ 253.566895, 169.284302, 50.926048, 255.0f },
	{ 253.814255, 166.619553, 49.921349, 255.0f },
	{ 253.997864, 163.906342, 48.870750, 255.0f },
	{ 254.117706, 161.142151, 47.781898, 255.0f },
	{ 254.171249, 158.337158, 46.657352, 255.0f },
	{ 254.163605, 155.491348, 45.497101, 255.0f },
	{ 254.092194, 152.607300, 44.308800, 255.0f },
	{ 253.962158, 149.692642, 43.092449, 255.0f },
	{ 253.768356, 146.749954, 41.850601, 255.0f },
	{ 253.518448, 143.784302, 40.590900, 255.0f },
	{ 253.207352, 140.795700, 39.313351, 255.0f },
	{ 252.840149, 137.791794, 38.020500, 255.0f },
	{ 252.416855, 134.777710, 36.714901, 255.0f },
	{ 251.937454, 131.750854, 35.401653, 255.0f },
	{ 251.404495, 128.721451, 34.085850, 255.0f },
	{ 250.818008, 125.692047, 32.764950, 255.0f },
	{ 250.175400, 122.665199, 31.446600, 255.0f },
	{ 249.484360, 119.645996, 30.133350, 255.0f },
	{ 248.739746, 116.637001, 28.827749, 255.0f },
	{ 247.946701, 113.640755, 27.532351, 255.0f },
	{ 247.105194, 110.667450, 26.249701, 255.0f },
	{ 246.215256, 107.714554, 24.984900, 255.0f },
	{ 245.276855, 104.787155, 23.740499, 255.0f },
	{ 244.292557, 101.892899, 22.519051, 255.0f },
	{ 243.264908, 99.031799, 21.323099, 255.0f },
	{ 242.191345, 96.208954, 20.157749, 255.0f },
	{ 241.071899, 93.426903, 19.025551, 255.0f },
	{ 239.914200, 90.693298, 17.929049, 255.0f },
	{ 238.710587, 88.008148, 16.870800, 255.0f },
	{ 237.468750, 85.379097, 15.855901, 255.0f },
	{ 236.188660, 82.806152, 14.884351, 255.0f },
	{ 234.867752, 80.296951, 13.961249, 255.0f },
	{ 233.508591, 77.851501, 13.091700, 255.0f },
	{ 232.111206, 75.477448, 12.275701, 255.0f },
	{ 230.680649, 73.174805, 11.515800, 255.0f },
	{ 229.214401, 70.951202, 10.819650, 255.0f },
	{ 227.709900, 68.801544, 10.182150, 255.0f },
	{ 226.162048, 66.687599, 9.570150, 255.0f },
	{ 224.568298, 64.601700, 8.978550, 255.0f },
	{ 222.926102, 62.541302, 8.407350, 255.0f },
	{ 221.238007, 60.511497, 7.859100, 255.0f },
	{ 219.501450, 58.509750, 7.331250, 255.0f },
	{ 217.718994, 56.533501, 6.826350, 255.0f },
	{ 215.888107, 54.587852, 6.341850, 255.0f },
	{ 214.011292, 52.667702, 5.877750, 255.0f },
	{ 212.088593, 50.775600, 5.434050, 255.0f },
	{ 210.117447, 48.914101, 5.013300, 255.0f },
	{ 208.100388, 47.078098, 4.612950, 255.0f },
	{ 206.037460, 45.270153, 4.233000, 255.0f },
	{ 203.926041, 43.490250, 3.876000, 255.0f },
	{ 201.768753, 41.738400, 3.536850, 255.0f },
	{ 199.563004, 40.017151, 3.223200, 255.0f },
	{ 197.311340, 38.321400, 2.927400, 255.0f },
	{ 195.013809, 36.653698, 2.654550, 255.0f },
	{ 192.667801, 35.014050, 2.402100, 255.0f },
	{ 190.273346, 33.399899, 2.170050, 255.0f },
	{ 187.835556, 31.816351, 1.960950, 255.0f },
	{ 185.349304, 30.260851, 1.772250, 255.0f },
	{ 182.814606, 28.733400, 1.603950, 255.0f },
	{ 180.233994, 27.233999, 1.456050, 255.0f },
	{ 177.607498, 25.760099, 1.331100, 255.0f },
	{ 174.935104, 24.316801, 1.226550, 255.0f },
	{ 172.214249, 22.899000, 1.144950, 255.0f },
	{ 169.444946, 21.511801, 1.081200, 255.0f },
	{ 166.629761, 20.150101, 1.040400, 255.0f },
	{ 163.768646, 18.819000, 1.022550, 255.0f },
	{ 160.859100, 17.513401, 1.022550, 255.0f },
	{ 157.903641, 16.235851, 1.045500, 255.0f },
	{ 154.902313, 14.988900, 1.088850, 255.0f },
	{ 151.852493, 13.767449, 1.155150, 255.0f },
	{ 148.756805, 12.574050, 1.239300, 255.0f },
	{ 145.612656, 11.408700, 1.348950, 255.0f },
	{ 142.422607, 10.271399, 1.476450, 255.0f },
	{ 139.186646, 9.162150, 1.626900, 255.0f },
	{ 135.902252, 8.080951, 1.797750, 255.0f },
	{ 132.571945, 7.027800, 1.989000, 255.0f },
	{ 129.193207, 6.002700, 2.200650, 255.0f },
	{ 125.768547, 5.005650, 2.435250, 255.0f },
	{ 122.298004, 4.036650, 2.690250, 255.0f },
	{ 68.086021, 1.242870, 84.000824, 255.0f },
	{ 68.470055, 2.449275, 85.533882, 255.0f },
	{ 68.835724, 3.729375, 87.051643, 255.0f },
	{ 69.182777, 5.085210, 88.553596, 255.0f },
	{ 69.511475, 6.518565, 90.038712, 255.0f },
	{ 69.821289, 8.031735, 91.507515, 255.0f },
	{ 70.112755, 9.626760, 92.958466, 255.0f },
	{ 70.385605, 11.262586, 94.391823, 255.0f },
	{ 70.639595, 12.837720, 95.807320, 255.0f },
	{ 70.874954, 14.362620, 97.203705, 255.0f },
	{ 71.091705, 15.846974, 98.580963, 255.0f },
	{ 71.289330, 17.298180, 99.938835, 255.0f },
	{ 71.468086, 18.721334, 101.276566, 255.0f },
	{ 71.627975, 20.121284, 102.593895, 255.0f },
	{ 71.768730, 21.501600, 103.890564, 255.0f },
	{ 71.890625, 22.864830, 105.165825, 255.0f },
	{ 71.993385, 24.213524, 106.419411, 255.0f },
	{ 72.077286, 25.549978, 107.650803, 255.0f },
	{ 72.142044, 26.875216, 108.860008, 255.0f },
	{ 72.188210, 28.191013, 110.046265, 255.0f },
	{ 72.215233, 29.498400, 111.209328, 255.0f },
	{ 72.223396, 30.798136, 112.348923, 255.0f },
	{ 72.212685, 32.091240, 113.464798, 255.0f },
	{ 72.183357, 33.378227, 114.556458, 255.0f },
	{ 72.135422, 34.659599, 115.623878, 255.0f },
	{ 72.068863, 35.936131, 116.666832, 255.0f },
	{ 71.983955, 37.207561, 117.685051, 255.0f },
	{ 71.881187, 38.474655, 118.678268, 255.0f },
	{ 71.760063, 39.737671, 119.646255, 255.0f },
	{ 71.621338, 40.996605, 120.589241, 255.0f },
	{ 71.465019, 42.251717, 121.506989, 255.0f },
	{ 71.291374, 43.502743, 122.399239, 255.0f },
	{ 71.100632, 44.749950, 123.266235, 255.0f },
	{ 70.893059, 45.993584, 124.107735, 255.0f },
	{ 70.669167, 47.233143, 124.923988, 255.0f },
	{ 70.429474, 48.468868, 125.715256, 255.0f },
	{ 70.173706, 49.700775, 126.481277, 255.0f },
	{ 69.902634, 50.928852, 127.222305, 255.0f },
	{ 69.616531, 52.152599, 127.938858, 255.0f },
	{ 69.316139, 53.372265, 128.630661, 255.0f },
	{ 69.001732, 54.587593, 129.298264, 255.0f },
	{ 68.673538, 55.798588, 129.942123, 255.0f },
	{ 68.331841, 57.004993, 130.562042, 255.0f },
	{ 67.977898, 58.206810, 131.158997, 255.0f },
	{ 67.611977, 59.403782, 131.732742, 255.0f },
	{ 67.234062, 60.595901, 132.284302, 255.0f },
	{ 66.845192, 61.782928, 132.813431, 255.0f },
	{ 66.445602, 62.965111, 133.321136, 255.0f },
	{ 66.036072, 64.141937, 133.807678, 255.0f },
	{ 65.617111, 65.313156, 134.273560, 255.0f },
	{ 65.189476, 66.479263, 134.719574, 255.0f },
	{ 64.753426, 67.639771, 135.145660, 255.0f },
	{ 64.309464, 68.794662, 135.552643, 255.0f },
	{ 63.858379, 69.943947, 135.941269, 255.0f },
	{ 63.400394, 71.087624, 136.311768, 255.0f },
	{ 62.936806, 72.225441, 136.664963, 255.0f },
	{ 62.467861, 73.357124, 137.001297, 255.0f },
	{ 61.993813, 74.483459, 137.321579, 255.0f },
	{ 61.515434, 75.603676, 137.625793, 255.0f },
	{ 61.033230, 76.718025, 137.915222, 255.0f },
	{ 60.547455, 77.826515, 138.189865, 255.0f },
	{ 60.059128, 78.929390, 138.450729, 255.0f },
	{ 59.568764, 80.026138, 138.698074, 255.0f },
	{ 59.076870, 81.117027, 138.932678, 255.0f },
	{ 58.583443, 82.202057, 139.155029, 255.0f },
	{ 58.089508, 83.281471, 139.365646, 255.0f },
	{ 57.595062, 84.355278, 139.565063, 255.0f },
	{ 57.100872, 85.423470, 139.753525, 255.0f },
	{ 56.607197, 86.486053, 139.931763, 255.0f },
	{ 56.114532, 87.543282, 140.100327, 255.0f },
	{ 55.623154, 88.595154, 140.259689, 255.0f },
	{ 55.133549, 89.641426, 140.409882, 255.0f },
	{ 54.645988, 90.682846, 140.551926, 255.0f },
	{ 54.160725, 91.719170, 140.686050, 255.0f },
	{ 53.678265, 92.750389, 140.812531, 255.0f },
	{ 53.198868, 93.776756, 140.932129, 255.0f },
	{ 52.722778, 94.798294, 141.044830, 255.0f },
	{ 52.250267, 95.815231, 141.150925, 255.0f },
	{ 51.781063, 96.827583, 141.250870, 255.0f },
	{ 51.315945, 97.835854, 141.344971, 255.0f },
	{ 50.854652, 98.839790, 141.433716, 255.0f },
	{ 50.397179, 99.839645, 141.517105, 255.0f },
	{ 49.944298, 100.835419, 141.595367, 255.0f },
	{ 49.495502, 101.827362, 141.669067, 255.0f },
	{ 49.051037, 102.815742, 141.738190, 255.0f },
	{ 48.610905, 103.800560, 141.802689, 255.0f },
	{ 48.175365, 104.782051, 141.863129, 255.0f },
	{ 47.743908, 105.760223, 141.919479, 255.0f },
	{ 47.316780, 106.735352, 141.972015, 255.0f },
	{ 46.893990, 107.707664, 142.020721, 255.0f },
	{ 46.475281, 108.676918, 142.065613, 255.0f },
	{ 46.060394, 109.643623, 142.106903, 255.0f },
	{ 45.649845, 110.607780, 142.144653, 255.0f },
	{ 45.242867, 111.569382, 142.179062, 255.0f },
	{ 44.839455, 112.528946, 142.209686, 255.0f },
	{ 44.439869, 113.486221, 142.236969, 255.0f },
	{ 44.043346, 114.441704, 142.260666, 255.0f },
	{ 43.649879, 115.395149, 142.281067, 255.0f },
	{ 43.259727, 116.346809, 142.297653, 255.0f },
	{ 42.872131, 117.296936, 142.310913, 255.0f },
	{ 42.487335, 118.245544, 142.320343, 255.0f },
	{ 42.104836, 119.192863, 142.325958, 255.0f },
	{ 41.724377, 120.138916, 142.327744, 255.0f },
	{ 41.346207, 121.083687, 142.325699, 255.0f },
	{ 40.969578, 122.027702, 142.319321, 255.0f },
	{ 40.594467, 122.970436, 142.308609, 255.0f },
	{ 40.220894, 123.912659, 142.293320, 255.0f },
	{ 39.848850, 124.854118, 142.273682, 255.0f },
	{ 39.477825, 125.794815, 142.249191, 255.0f },
	{ 39.107822, 126.735001, 142.219620, 255.0f },
	{ 38.739090, 127.674667, 142.184692, 255.0f },
	{ 38.371380, 128.614105, 142.144653, 255.0f },
	{ 38.004944, 129.552994, 142.098755, 255.0f },
	{ 37.639786, 130.491913, 142.047485, 255.0f },
	{ 37.275902, 131.430313, 141.989868, 255.0f },
	{ 36.913544, 132.368713, 141.925858, 255.0f },
	{ 36.552464, 133.307129, 141.855225, 255.0f },
	{ 36.193428, 134.245514, 141.777710, 255.0f },
	{ 35.836678, 135.183655, 141.693039, 255.0f },
	{ 35.482483, 136.122055, 141.600983, 255.0f },
	{ 35.131348, 137.060455, 141.501038, 255.0f },
	{ 34.784039, 137.999115, 141.393158, 255.0f },
	{ 34.441830, 138.937515, 141.277390, 255.0f },
	{ 34.104465, 139.876419, 141.152954, 255.0f },
	{ 33.773220, 140.815079, 141.019577, 255.0f },
	{ 33.448860, 141.754257, 140.877045, 255.0f },
	{ 33.132915, 142.693405, 140.725327, 255.0f },
	{ 32.825893, 143.632584, 140.563400, 255.0f },
	{ 32.529842, 144.571991, 140.391785, 255.0f },
	{ 32.245514, 145.511414, 140.209457, 255.0f },
	{ 31.975470, 146.451080, 140.016922, 255.0f },
	{ 31.720724, 147.390503, 139.813171, 255.0f },
	{ 31.483065, 148.330185, 139.598480, 255.0f },
	{ 31.264530, 149.269608, 139.372040, 255.0f },
	{ 31.066904, 150.209030, 139.133865, 255.0f },
	{ 30.892740, 151.148438, 138.883453, 255.0f },
	{ 30.744074, 152.087616, 138.620804, 255.0f },
	{ 30.623459, 153.026520, 138.345154, 255.0f },
	{ 30.533190, 153.965164, 138.057007, 255.0f },
	{ 30.475559, 154.903320, 137.755585, 255.0f },
	{ 30.452866, 155.840958, 137.440399, 255.0f },
	{ 30.468164, 156.778336, 137.111465, 255.0f },
	{ 30.523245, 157.714951, 136.768478, 255.0f },
	{ 30.620655, 158.651047, 136.411240, 255.0f },
	{ 30.762690, 159.586151, 136.039429, 255.0f },
	{ 30.951900, 160.520462, 135.653122, 255.0f },
	{ 31.189560, 161.454025, 135.251495, 255.0f },
	{ 31.478220, 162.386292, 134.834564, 255.0f },
	{ 31.818899, 163.317566, 134.402344, 255.0f },
	{ 32.213127, 164.247284, 133.954300, 255.0f },
	{ 32.662186, 165.175995, 133.490204, 255.0f },
	{ 33.167088, 166.102921, 133.010040, 255.0f },
	{ 33.728340, 167.028564, 132.513550, 255.0f },
	{ 34.346458, 167.952179, 132.000488, 255.0f },
	{ 35.021442, 168.874268, 131.470612, 255.0f },
	{ 35.753551, 169.794037, 130.923889, 255.0f },
	{ 36.542267, 170.712036, 130.359818, 255.0f },
	{ 37.387077, 171.627747, 129.778671, 255.0f },
	{ 38.287743, 172.540894, 129.180191, 255.0f },
	{ 39.242973, 173.451767, 128.563873, 255.0f },
	{ 40.252003, 174.360077, 127.929924, 255.0f },
	{ 41.314079, 175.265579, 127.277893, 255.0f },
	{ 42.427666, 176.168274, 126.608009, 255.0f },
	{ 43.591740, 177.067917, 125.919762, 255.0f },
	{ 44.805283, 177.964493, 125.213409, 255.0f },
	{ 46.066517, 178.857513, 124.488197, 255.0f },
	{ 47.374664, 179.747208, 123.744614, 255.0f },
	{ 48.727951, 180.633331, 122.982422, 255.0f },
	{ 50.125607, 181.515884, 122.201355, 255.0f },
	{ 51.565845, 182.394363, 121.401421, 255.0f },
	{ 53.047649, 183.268753, 120.582619, 255.0f },
	{ 54.570000, 184.139084, 119.744942, 255.0f },
	{ 56.131622, 185.004791, 118.887634, 255.0f },
	{ 57.731232, 185.866440, 118.011192, 255.0f },
	{ 59.367825, 186.722977, 117.115639, 255.0f },
	{ 61.040371, 187.574951, 116.200439, 255.0f },
	{ 62.747849, 188.422058, 115.266121, 255.0f },
	{ 64.489243, 189.263794, 114.312424, 255.0f },
	{ 66.263535, 190.100449, 113.339088, 255.0f },
	{ 68.069962, 190.931503, 112.346115, 255.0f },
	{ 69.907997, 191.756943, 111.333260, 255.0f },
	{ 71.776634, 192.576767, 110.300766, 255.0f },
	{ 73.674858, 193.390472, 109.248627, 255.0f },
	{ 75.602142, 194.198044, 108.176865, 255.0f },
	{ 77.557739, 194.999512, 107.085464, 255.0f },
	{ 79.540871, 195.794617, 105.974426, 255.0f },
	{ 81.551292, 196.583069, 104.843758, 255.0f },
	{ 83.587982, 197.364899, 103.693199, 255.0f },
	{ 85.650673, 198.139587, 102.522499, 255.0f },
	{ 87.738876, 198.907394, 101.332153, 255.0f },
	{ 89.851799, 199.667816, 100.122177, 255.0f },
	{ 91.988953, 200.420822, 98.892563, 255.0f },
	{ 94.149567, 201.166428, 97.643074, 255.0f },
	{ 96.333649, 201.904160, 96.374443, 255.0f },
	{ 98.540413, 202.634216, 95.085930, 255.0f },
	{ 100.769371, 203.356125, 93.778030, 255.0f },
	{ 103.020256, 204.070129, 92.450760, 255.0f },
	{ 105.292816, 204.775452, 91.103592, 255.0f },
	{ 107.586540, 205.472366, 89.737045, 255.0f },
	{ 109.900665, 206.160614, 88.351379, 255.0f },
	{ 112.234932, 206.840179, 86.946587, 255.0f },
	{ 114.588837, 207.510849, 85.522926, 255.0f },
	{ 116.961876, 208.172562, 84.080383, 255.0f },
	{ 119.353516, 208.824860, 82.619492, 255.0f },
	{ 121.763519, 209.468216, 81.139725, 255.0f },
	{ 124.191635, 210.101898, 79.641853, 255.0f },
	{ 126.636826, 210.725891, 78.126137, 255.0f },
	{ 129.099106, 211.340439, 76.592308, 255.0f },
	{ 131.577957, 211.945282, 75.041145, 255.0f },
	{ 134.072891, 212.540207, 73.472389, 255.0f },
	{ 136.583359, 213.125168, 71.886543, 255.0f },
	{ 139.108627, 213.699936, 70.284630, 255.0f },
	{ 141.648422, 214.264771, 68.666656, 255.0f },
	{ 144.201996, 214.819656, 67.033630, 255.0f },
	{ 146.768570, 215.364334, 65.385826, 255.0f },
	{ 149.347885, 215.898544, 63.723736, 255.0f },
	{ 151.938950, 216.422821, 62.048897, 255.0f },
	{ 154.541473, 216.936905, 60.361557, 255.0f },
	{ 157.154724, 217.440796, 58.663258, 255.0f },
	{ 159.777649, 217.934479, 56.955013, 255.0f },
	{ 162.410004, 218.418213, 55.238098, 255.0f },
	{ 165.050522, 218.891998, 53.514553, 255.0f },
	{ 167.698715, 219.355850, 51.785908, 255.0f },
	{ 170.353760, 219.809738, 50.054714, 255.0f },
	{ 173.014709, 220.254211, 48.323265, 255.0f },
	{ 175.680710, 220.689240, 46.594875, 255.0f },
	{ 178.350830, 221.114838, 44.872604, 255.0f },
	{ 181.023987, 221.531509, 43.160534, 255.0f },
	{ 183.699692, 221.939255, 41.463768, 255.0f },
	{ 186.376694, 222.338577, 39.787395, 255.0f },
	{ 189.053940, 222.729507, 38.138054, 255.0f },
	{ 191.730423, 223.112503, 36.523140, 255.0f },
	{ 194.405106, 223.488129, 34.951317, 255.0f },
	{ 197.077255, 223.856339, 33.432796, 255.0f },
	{ 199.745331, 224.217667, 31.978275, 255.0f },
	{ 202.408798, 224.572891, 30.601274, 255.0f },
	{ 205.066406, 224.921722, 29.316074, 255.0f },
	{ 207.716888, 225.265213, 28.138485, 255.0f },
	{ 210.359711, 225.603607, 27.085335, 255.0f },
	{ 212.993851, 225.937393, 26.174730, 255.0f },
	{ 215.618057, 226.267105, 25.424009, 255.0f },
	{ 218.231552, 226.593262, 24.850260, 255.0f },
	{ 220.833313, 226.916351, 24.468016, 255.0f },
	{ 223.422836, 227.236877, 24.288752, 255.0f },
	{ 225.999100, 227.555359, 24.320372, 255.0f },
	{ 228.561600, 227.872086, 24.565426, 255.0f },
	{ 231.109299, 228.188034, 25.021875, 255.0f },
	{ 233.641708, 228.503204, 25.682835, 255.0f },
	{ 236.157028, 228.819153, 26.538105, 255.0f },
	{ 238.655533, 229.135345, 27.573404, 255.0f },
	{ 241.137177, 229.452835, 28.773689, 255.0f },
	{ 243.601486, 229.771576, 30.122641, 255.0f },
	{ 246.047974, 230.092361, 31.604954, 255.0f },
	{ 248.476334, 230.415451, 33.204826, 255.0f },
	{ 250.886337, 230.741089, 34.908733, 255.0f },
	{ 253.278229, 231.070038, 36.703678, 255.0f },
};


// pointers to colormap palette arrays
static float4* colormapPalettesGPU = NULL;
static float4* colormapPalettesCPU = NULL;


// cudaColormapInit
cudaError_t cudaColormapInit()
{
	if( colormapPalettesGPU != NULL )
		return cudaSuccess;	 // already initialized

	// allocate memory
	const size_t numMaps = COLORMAP_VIRIDIS_INVERTED + 1;
	const size_t mapSize = sizeof(float4) * 256;
	const size_t memSize = mapSize * numMaps;

	if( CUDA_FAILED(cudaMalloc((void**)&colormapPalettesGPU, memSize)) )
		return cudaErrorMemoryAllocation;

	if( CUDA_FAILED(cudaMallocHost((void**)&colormapPalettesCPU, memSize)) )
		return cudaErrorMemoryAllocation;

	// copy palettes to pinned memory
	memcpy(colormapPalettesCPU, colormapPalettes, memSize/2);

	// create inverted palettes
	for( uint32_t c=0; c < numMaps/2; c++ )
		for( uint32_t n=0; n < 256; n++ )
			colormapPalettesCPU[((numMaps/2+c)*256)+n] = colormapPalettes[c*256+255-n];
			
	// copy palettes to GPU
	if( CUDA_FAILED(cudaMemcpy(colormapPalettesGPU, colormapPalettesCPU, memSize, cudaMemcpyHostToDevice)) )
		return cudaErrorInvalidMemcpyDirection;

	return cudaSuccess;
}
	

// cudaColormapFree
cudaError_t cudaColormapFree()
{
	if( colormapPalettesGPU != NULL )
	{
		CUDA(cudaFree(colormapPalettesGPU));
		colormapPalettesGPU = NULL;
	}

	if( colormapPalettesCPU != NULL )
	{
		CUDA(cudaFreeHost(colormapPalettesCPU));
		colormapPalettesCPU = NULL;
	}

	return cudaSuccess;
}


// cudaColormapPalette
float4* cudaColormapPalette( cudaColormapType colormap )
{
	if( colormap > COLORMAP_VIRIDIS_INVERTED )
		return NULL;

	if( CUDA_FAILED(cudaColormapInit()) )
		return NULL;

	return colormapPalettesGPU + (colormap * 256);
}


// gpuColormapPalette
template<typename T, cudaFilterMode filter>
__global__ void gpuColormapPalette( float4* palette, float* input, int input_width, int input_height,
							 T* output, int output_width, int output_height, 
							 float multiplier, float min_value )
{
	const int x = blockIdx.x * blockDim.x + threadIdx.x;
	const int y = blockIdx.y * blockDim.y + threadIdx.y;

	if( x >= output_width || y >= output_height )
		return;

	const float pixel = cudaFilterPixel<filter>(input, x, y, input_width, input_height, output_width, output_height);
	const float value = fmaxf(fminf((pixel - min_value) * multiplier, 255.0f), 0.0f); // __saturatef(pixel - min_value) * 255.0f; 

	output[y * output_width + x] = cast_vec<T>(palette[(int)value]);
}


// gpuColormapFlow
template<typename T, cudaFilterMode filter, cudaDataFormat format>
__global__ void gpuColormapFlow( float2* input, int input_width, int input_height,
						   T* output, int output_width, int output_height, 
						   float max_value )
{
	const int x = blockIdx.x * blockDim.x + threadIdx.x;
	const int y = blockIdx.y * blockDim.y + threadIdx.y;

	if( x >= output_width || y >= output_height )
		return;

	const float2 pixel = cudaFilterPixel<filter, format>(input, x, y, input_width, input_height, output_width, output_height);
	const float2 value = pixel / max_value;

	const float3 color = make_float3(1.0f + value.x,
							   1.0f - 0.5 * (value.x + value.y),
                                      1.0f + value.y) * 255.0f;

	/*const float4 color = make_float4(__saturatef(1.0f + value.y),
							   __saturatef(1.0f - 0.5 * (value.x + value.y)),
							   __saturatef(1.0f + value.x), 1.0f); 

	output[y * output_width + x] = color * 255.0f;*/
	
	const float3 clamped = clamp(color, 0.0f, 255.0f);
	
	output[y * output_width + x] = make_vec<T>(clamped.x, clamped.y, clamped.z, 255.0f);
}


// gpuColormapNone
template<typename T, cudaFilterMode filter, cudaDataFormat format>
__global__ void gpuColormapNone( T* input, int input_width, int input_height,
						   T* output, int output_width, int output_height )
{
	const int x = blockIdx.x * blockDim.x + threadIdx.x;
	const int y = blockIdx.y * blockDim.y + threadIdx.y;

	if( x >= output_width || y >= output_height )
		return;

	output[y * output_width + x] = cudaFilterPixel<filter, format>(input, x, y, input_width, input_height, output_width, output_height);
}



// cudaColormap
cudaError_t cudaColormap( float* input, size_t input_width, size_t input_height,
					 void* output, size_t output_width, size_t output_height,
					 const float2& input_range, cudaDataFormat input_format,
					 imageFormat output_format, cudaColormapType colormap, 
					 cudaFilterMode filter,  cudaStream_t stream )
{
	if( !input || !output )
		return cudaErrorInvalidDevicePointer;

	if( input_width == 0 || output_width == 0 || input_height == 0 || output_height == 0 )
		return cudaErrorInvalidValue;

	if( colormap > COLORMAP_NONE )
		return cudaErrorNotYetImplemented;

	if( input_width == output_width && input_height == output_height )
		filter = FILTER_POINT;

	// palettized colormaps
	if( colormap <= COLORMAP_VIRIDIS_INVERTED )
	{
		// get the pointer to the colormap
		float4* palette = cudaColormapPalette(colormap);

		if( !palette )
			return cudaErrorMemoryAllocation;
	 
		// calculate the multiplier to map from input_range -> [0,255]
		const float multiplier = 255.0f / (input_range.y - input_range.x);

		// launch kernel
		const dim3 blockDim(8, 8);
		const dim3 gridDim(iDivUp(output_width,blockDim.x), iDivUp(output_height,blockDim.y));

		#define colormapKernelFilter(type, filterMode) \
			gpuColormapPalette<type, filterMode><<<gridDim, blockDim, 0, stream>>>( \
								palette, input, input_width, input_height, \
								(type*)output, output_width, output_height, \
								multiplier, input_range.x);

		#define colormapKernel(type) \
		{ \
			if( filter == FILTER_POINT ) \
				colormapKernelFilter(type, FILTER_POINT) \
			else if( filter == FILTER_LINEAR ) \
				colormapKernelFilter(type, FILTER_LINEAR) \
		}

		if( output_format == IMAGE_RGB8 )
			colormapKernel(uchar3)
		else if( output_format == IMAGE_RGBA8 )
			colormapKernel(uchar4)
		else if( output_format == IMAGE_RGB32F )
			colormapKernel(float3)
		else if( output_format == IMAGE_RGBA32F )
			colormapKernel(float4)
		else
		{
			imageFormatErrorMsg(LOG_CUDA, "cudaColormap()", output_format);
			return cudaErrorInvalidValue;
		}
	}
	else if( colormap == COLORMAP_FLOW ) // parametric flow field
	{
		// get the maximum absolute value
		const float max_value = fmaxf(fabs(input_range.x), fabs(input_range.y));

		// launch kernel
		const dim3 blockDim(8, 8);
		const dim3 gridDim(iDivUp(output_width,blockDim.x), iDivUp(output_height,blockDim.y));

		#define flowKernelFilter(type, filterMode, layout) \
			gpuColormapFlow<type, filterMode, layout><<<gridDim, blockDim, 0, stream>>>( \
										 (float2*)input, input_width, input_height, \
										 (type*)output, output_width, output_height, \
										 max_value);

		#define flowKernel(type) \
		{ \
			if( filter == FILTER_POINT ) \
			{ \
				if( input_format == FORMAT_CHW ) \
					flowKernelFilter(type, FILTER_POINT, FORMAT_CHW) \
				else if( input_format == FORMAT_HWC ) \
					flowKernelFilter(type, FILTER_POINT, FORMAT_HWC) \
			} \
			else if( filter == FILTER_LINEAR ) \
			{ \
				if( input_format == FORMAT_CHW ) \
					flowKernelFilter(type, FILTER_LINEAR, FORMAT_CHW) \
				else if( input_format == FORMAT_HWC ) \
					flowKernelFilter(type, FILTER_LINEAR, FORMAT_HWC) \
			} \
		}
			
		if( output_format == IMAGE_RGB8 )
			flowKernel(uchar3)
		else if( output_format == IMAGE_RGBA8 )
			flowKernel(uchar4)
		else if( output_format == IMAGE_RGB32F )
			flowKernel(float3)
		else if( output_format == IMAGE_RGBA32F )
			flowKernel(float4)
		else
		{
			imageFormatErrorMsg(LOG_CUDA, "cudaColormap(COLORMAP_FLOW)", output_format);
			return cudaErrorInvalidValue;
		}
	}
	else if( colormap == COLORMAP_NONE )
	{
		// launch kernel
		const dim3 blockDim(8, 8);
		const dim3 gridDim(iDivUp(output_width,blockDim.x), iDivUp(output_height,blockDim.y));

		#define noneKernelFilter(type, filterMode, layout) \
			gpuColormapNone<type, filterMode, layout><<<gridDim, blockDim, 0, stream>>>( \
										 (type*)input, input_width, input_height, \
										 (type*)output, output_width, output_height);

		#define noneKernel(type) \
		{ \
			if( filter == FILTER_POINT ) \
			{ \
				if( input_format == FORMAT_CHW ) \
					noneKernelFilter(type, FILTER_POINT, FORMAT_CHW) \
				else if( input_format == FORMAT_HWC ) \
					noneKernelFilter(type, FILTER_POINT, FORMAT_HWC) \
			} \
			else if( filter == FILTER_LINEAR ) \
			{ \
				if( input_format == FORMAT_CHW ) \
					noneKernelFilter(type, FILTER_LINEAR, FORMAT_CHW) \
				else if( input_format == FORMAT_HWC ) \
					noneKernelFilter(type, FILTER_LINEAR, FORMAT_HWC) \
			} \
		}
		
		if( output_format == IMAGE_GRAY8 )
			noneKernel(uchar)
		else if( output_format == IMAGE_GRAY32F )
			noneKernel(float)
		/*else if( output_format == IMAGE_RGB8 )
			noneKernel(uchar3)
		else if( output_format == IMAGE_RGBA8 )
			noneKernel(uchar4)*/
		else if( output_format == IMAGE_RGB32F )
			noneKernel(float3)
		else if( output_format == IMAGE_RGBA32F )
			noneKernel(float4)
		else
		{
			LogError(LOG_CUDA "cudaColormap(COLORMAP_NONE) -- unsupported image format (%s)\n", imageFormatToStr(output_format));
			LogError(LOG_CUDA "      supported formats are:\n");
			LogError(LOG_CUDA "          * gray8\n");
			LogError(LOG_CUDA "          * gray32f\n");
			//LogError(LOG_CUDA "          * rgb8\n");		
			//LogError(LOG_CUDA "          * rgba8\n");		
			LogError(LOG_CUDA "          * rgb32f\n");		
			LogError(LOG_CUDA "          * rgba32f\n");
			
			return cudaErrorInvalidValue;
		}
	}

	return CUDA(cudaGetLastError());
}


// cudaColormap
cudaError_t cudaColormap( float* input, void* output, size_t width, size_t height,
					 const float2& input_range, cudaDataFormat input_format,
					 imageFormat output_format, cudaColormapType colormap,
					 cudaStream_t stream)
{
	return cudaColormap(input, width, height, output, width, height,
					input_range, input_format, output_format, 
					colormap, FILTER_POINT, stream);
}


